2012-07-03 5 views
5

Sto creando un ExpandableListView con dati da un database. Per questo, sto usando un CursorTreeAdapter e lo popolo con un oggetto Cursor che contiene i dati che ho recuperato dal database.EspandibileListView mostra un indicatore per gruppi senza figli

Ho pensato che, per impostazione predefinita Android avrebbe considerato i gruppi senza figlio "non espandibile".

Tuttavia mostra ancora l'icona di espansione sulla riga e quando faccio clic, non fa nulla. Non voglio che mostri questa icona.

Voglio solo che i gruppi che hanno childs mostrino l'icona di espansione, che non sta succedendo. Mostra l'icona di espansione per tutte le righe (quelle con figlio e senza figlio).


UPDATE

ho studiato il mio codice e ho visto che il problema è fondamentalmente nel fissare la groupIndicator per i gruppi. Tuttavia Ho provato un sacco di approcci come la creazione di un selettore e l'impostazione E 'drawable in base allo stato ed espandibile, in questo modo:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_empty="true" 
      android:state_expanded="false" 
      android:drawable="@android:color/transparent"/> 
    <item android:drawable="@drawable/expander_ic_maximized" /> 
</selector> 

Ma quando il gruppo è compresso si nasconde per tutte le compresi quelli con i bambini (perché Gruppi compressi riconosciuti da Android come vuoti).

Qualunque approccio migliore per impostare l'indicatore solo per gruppi con bambini?


Ecco il mio codice.

public class ContactsExpandableListAdapter extends CursorTreeAdapter 
{ 

    TextView mContactNameTextView, mContactNumberTextView; 
    Cursor mChildrenCursor = null; 

    public ContactsExpandableListAdapter(Cursor cursor, Context context) 
    { 
     super(cursor, context); 
    } 

    @Override 
    protected Cursor getChildrenCursor(Cursor cursor) 
    { 
     if(mContactId == -1) 
      mContactId = null; 

     return mController.getContactById(mContactId); 
    } 

    public int getChildrenCount(int groupPosition) 
    { 
     return mChildrenCursor.getCount(); 
    } 

    @Override 
    protected View newGroupView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup) 
    { 
     View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false); 

     mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); 

     if(cursor.getString(cursor.getColumnIndex("contact_name")) == null)     mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      else 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name"))); 
      view.setTag(cursor.getString(cursor.getColumnIndex("contact_id"))); 
      return view; 
     } 

     @Override 
     protected View newChildView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup) 
     { 
      View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false); 

      if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) 
      { 
       mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      } 
      else 
      { 
       mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number); 
       mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      } 

      view.setTag(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      return view; 
     } 

     @Override 
     protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean) 
     { 
      mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); 
      if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      else 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name"))); 

view.setTag(cursor.getString(cursor.getColumnIndex("contact_id"))); 
     } 

     @Override 
     protected void bindChildView(View view, Context context, Cursor cursor, boolean paramBoolean) 
     { 
      if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) 
      { 
       mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      } 
      else 
      { 
       mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number); 
       mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      } 
     } 
    } 

risposta

7

Nella tua xml aggiungere il seguente per ExpandableListView:

android:groupIndicator="@android:color/transparent" 

Than ciascun Gruppo Articolo View nel vostro adattatore ha bisogno del suo indicatore interno. Ad esempio, puoi aggiungere un ImageView sul lato destro del tuo .xml.

Poi nel adattatore eseguire le seguenti operazioni:

@Override 
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean) 
    ... 

    if (getChildrenCount(groupPosition) > 0) { 
     viewHolder.indicator.setVisibility(View.VISIBLE); 
     viewHolder.indicator.setImageResource(
       isExpanded ? R.drawable.indicator_expanded : R.drawable.indicator); 
    } else { 
     viewHolder.indicator.setVisibility(View.GONE); 
    } 
} 
+1

Come posso restituire una vista in un metodo vuoto? heheh Forse dovrebbe essere nel metodo 'newGroupView()' corretto? A proposito, che cos'è ** viewHolder ** e che cos'è ** indicatore **? – rogcg

+0

scusate. il ritorno era sbagliato, vero. nell'adattatore del cursore non è necessario restituire la vista: D. Informazioni su ViewHolder (uno schema per velocizzare le cose negli elenchi): http://www.youtube.com/watch?v=wDBM6wVEO70&feature=player_detailpage#t=511s –

+0

Sopra il link che sta sviluppando per parlare di ViewHolder. Quindi lo spiega su http://www.youtube.com/watch?v = wDBM6wVEO70 & feature = player_detailpage # t = 511s –

0

Perché non lasciare i gruppi senza figli?

Modifica la query per fornire solo gruppi che avranno figli.

+0

ma voglio mostrare gli elementi che non hanno figli troppo, ma mostrando solo il numero di contatto, solo una singola riga in espansione. – rogcg

2

Nella scheda di classe di utilizzo:

public View getGroupView(int groupPosition, boolean isExpanded, View convertView,ViewGroup parent) 
{ 
    if (getChildrenCount(groupPosition) == 0) { 
      indicator.setVisibility(View.INVISIBLE); 
    } 
    else { 
      indicator.setVisibility(View.VISIBLE); 
      indicator.setImageResource(isExpanded ? R.drawable.group_expanded : R.drawable.group_closed); 
    } 
} 
+1

Che cos'è l'indicatore qui? –

+0

L'indicatore è l'icona sul lato destro di ExpandableListView, è simile a V .Its mostra lo stato di listview come espanso o compresso. – kabir