2011-11-28 20 views
22

Attualmente sto lavorando su un progetto in cui ho bisogno di qualcosa di simile al seguente:multistrato ExpandableListView

- MainGroup 1 (Expandable) 
    - SubGroup 1 (Expandable) 
    - SubSubGroup 1 (Expandable) 
     - Child View 
     - Child View 
     - ... 
    - SubSubGroup 2 (Expandable) 
     - Child View 
     - Child View 
     - ... 
    - SubGroup 2 (Expandable) 
    - SubSubGroup 3 (Expandable) 
     - Child View 
     - ... 
    - SubSubGroup 4 (Expandable) 
     - Child View 
     - ... 
    - SubGroup 3 (Expandable) 
    - Child View 
    - ... 
- MainGroup 2 (Expandable) 
    - ... 

Al massimo sarebbe un ExpandableListView all'interno di un ExpandableListView all'interno di un ExpandableListView - quindi 3 strati di ExpandableListView :

  • MainGroup detiene solo altri ExpandableListView.
  • SubGroup potrebbe contenere altri ExpandableListView tranne gli ultimi due, che saranno sempre solo ChildViews. (Sto pensando che quei due potrebbero essere semplicemente sostituiti con quello per SubSubGroup)
  • SubSubGroup manterrebbero sempre ChildViews.

Il mio problema è che penso di non riuscire a capire i principi di base di come i layout disiano bambini. Ho guardato esempi come this, ma non riesco a capire la funzionalità.

Ho provato semplicemente ad aggiungere un ExpandableListView come un bambino in un altro - ma qualcosa non funziona come solo il primo elemento interno è visibile se si espande uno dei gruppi esterni. Posso tuttavia impostare manualmente l'altezza del contenitore dei gruppi esterni per renderlo abbastanza grande da mostrare tutti gli elementi all'interno di ExpandableListView. Per essere ottimale, il calcolo dell'altezza dovrebbe ovviamente essere fatto al volo.

Quindi, per ottenere ad alcune domande più solide:

  • Qualcuno può darmi una spiegazione del "ciclo di vita" ExpandableListView (da questo voglio dire instantation, riutilizzo di opinioni, espandere/ascoltatori collasso) incluso:
    • Come e quando viene inviato un avviso ExpandableListView a un bambino espanso/compresso?
    • In che modo lo ExpandableListView sa quanto spazio è necessario inserire per tutti i bambini in un contenitore di gruppo?
  • Quanto vantaggio c'è nel usando il ExpandableListView per creare quanto sopra, rispetto ad appena il mescolando insieme la mia soluzione utilizzando alcuni LinearLayouts e alcuni OnClickListeners?

Modifica

Per la mia ultima domanda potrei notare che non ci può essere ovunque da 1 a 20 + MainGroups.

+0

la soluzione è stata risolta ..? –

+0

Non ho mai effettivamente risolto il problema mentre ero spostato su un altro progetto, ma la risposta di QuickNick sarebbe stata sicuramente la strada da percorrere. – kaspermoerch

risposta

10

Prima di tutto, lasciate che vi consiglio GrepCode sito. Ha fonti di classi SDK Android. Grazie per loro, ho scoperto i principi base di AdapterViews (ti ho dato un link a ExpandableListView, ma è meglio se fai ricerche non solo su di esso, ma anche sui suoi genitori di classe).

Ora, le vostre domande e le mie risposte:

Come e quando è un ExpandableListView notificato che un bambino è ampliato/crollata?

veda il metodo handleItemClick(View v, int position, long id)

Come fa l'ExpandableListView sa quanto spazio per fare a tutti i bambini per adattarsi in un contenitore di gruppo?

Non ho cercato bene questa domanda, ma per quanto ne so, è fatta dal metodo requestLayout(). Inoltre abbiamo scoperto che una vista scorrevole non può essere incorporata in un'altra vista scorrevole. (È un errore noto: mettere ListView in ScrollView o ListView in ExpandableListView).

Quanto vantaggio c'è nel usando l'ExpandableListView per creare quanto sopra, rispetto ad appena il mescolando insieme la mia soluzione utilizzando alcuni LinearLayouts e alcuni OnClickListeners?

AdapterViews sono più veloci. Ma la tua costruzione è troppo complessa anche per ExpandableListView. Puoi usare 2 soluzioni.

  1. Guru-soluzione: se siete professionisti di progettare il proprio Vista/ViewGroups da zero (voglio dire, anche di comprendere i metodi requestLayout(), dispatchDraw() e così via), quindi scrivere il proprio GrandExpandableListAdapter con 3 livelli.
  2. Soluzione media: utilizzare ExpandableListAdapter per i primi 2 livelli e utilizzare LinearLayouts per 3o livello.
1

È possibile controllare il progetto this. Non l'ho provato, ma credo che valga la pena provare. L'ExpanadableListView predefinito è piuttosto limitato, progettato originariamente per supportare solo 2 livelli. Puoi incappare in esso per ottenere più livelli di supporto, ma diventerà disordinato.

+0

In che modo utilizzarlo per la mia licenza? Sto sviluppando per un'azienda, quindi non posso fare cose che richiederebbero che il mio codice sorgente fosse open source. – kaspermoerch

+0

Non sono sicuro che la licenza BSD richieda di mantenere aperto il progetto. Almeno non sono riuscito a trovare nulla che affermasse diversamente qui: http://www.opensource.org/licenses/bsd-license.php. Potrei essere terribilmente sbagliato però. –

+0

Concessione di licenze a parte - soddisferà il mio scopo in modo +1. Trovo che solo l'esecuzione del semplice esempio fornito nella sorgente sia abbastanza lenta, quindi sono ancora alla ricerca di risposte alle mie domande. – kaspermoerch

1

Anche se questa non è la soluzione completa, è ancora una lista espandibile a 3 livelli. Quindi ti è rimasto come lo stile.

qui è la classe

package com.custom.nagee; 

import android.app.ExpandableListActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.ExpandableListView; 
import android.widget.LinearLayout; 

public class CustomemExpandible extends ExpandableListActivity{ 
    LayoutInflater inflator; 
    boolean flag = true; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     inflator = LayoutInflater.from(getApplicationContext()); 
     setListAdapter(new MyAdapter()); 
    } 

    @Override 
    public boolean onChildClick(ExpandableListView parent, View v, 
      int groupPosition, int childPosition, long id) { 
     if(flag){ 
      v.findViewById(childPosition).setVisibility(View.VISIBLE); 
      flag = false; 
      return true; 
     } 
     v.findViewById(childPosition).setVisibility(View.GONE); 
     flag = true; 
     return true; 
    } 
    class MyAdapter extends BaseExpandableListAdapter{ 

     @Override 
     public Object getChild(int groupPosition, int childPosition) { 
      return null; 
     } 

     @Override 
     public long getChildId(int groupPosition, int childPosition) { 
      return 0; 
     } 

     @Override 
     public View getChildView(int groupPosition, int childPosition, 
       boolean isLastChild, View convertView, ViewGroup parent) { 
      LinearLayout linearLayout = (LinearLayout)inflator.inflate(R.layout.group, null); 
      linearLayout.getChildAt(1).setId(childPosition); 
      return linearLayout; 
     } 

     @Override 
     public int getChildrenCount(int groupPosition) { 
      return 2; 
     } 

     @Override 
     public Object getGroup(int groupPosition) { 
      return null; 
     } 

     @Override 
     public int getGroupCount() { 
      return 2; 
     } 

     @Override 
     public long getGroupId(int groupPosition) { 
      return 0; 
     } 

     @Override 
     public View getGroupView(int groupPosition, boolean isExpanded, 
       View convertView, ViewGroup parent) { 
      return ((LinearLayout)inflator.inflate(R.layout.group, null)); 
     } 

     @Override 
     public boolean hasStableIds() { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public boolean isChildSelectable(int groupPosition, int childPosition) { 
      return true; 
     } 

    } 
} 

e qui va il file xml

group.xml

<?xml version="1.0" encoding="utf-8"?> 

<TextView 
    android:id="@+id/editText1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="@color/back" 
    android:layout_marginLeft="30dip" 
    android:text="DONE" > 
</TextView> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:layout_marginLeft="30dip" 
    android:visibility="gone" > 

    <TextView 
     android:id="@+id/editText2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="DONE"> 
    </TextView> 

    <TextView 
     android:id="@+id/editText3" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="DONE" /> 

    <TextView 
     android:id="@+id/editText4" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="DONE" /> 
</LinearLayout> 

e questo si trova nella cartella dei colori per cambiare il colore del testo, ma è anche possibile modificare lo sfondo per ottenere un aspetto migliore.

back.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_enabled="false" android:color="#808080"/> 
    <item android:state_window_focused="false" android:color="#808080"/> 
    <item android:state_pressed="true" android:color="#808080"/> 
    <item android:state_selected="true" android:color="#000000"/> 
    <item android:color="#FF0000"/> <!-- not selected --> 
</selector> 

spero che funziona ...

Problemi correlati