2012-07-03 13 views
5

Estoy creando un ExpandableListView con datos de una base de datos. Para eso, estoy usando un CursorTreeAdapter y lo lleno con un objeto Cursor que contiene los datos que recupero de la base de datos.ExpandableListView muestra el indicador para grupos sin hijos

Pensé que, por defecto, Android consideraría los grupos sin hijos "no ampliable".

Sin embargo, sigue mostrando el ícono expandir en la fila, y cuando hago clic en él, no hace nada. No quiero que muestre este ícono.

Solo quiero que los grupos que tienen hijos muestren el ícono expandir, lo que no está sucediendo. Muestra el icono expandir para todas las filas (aquellas con hijo y sin hijo).


ACTUALIZACIÓN

he estudiado mi código y he visto que el problema es básicamente en el establecimiento de la groupIndicator para los grupos. Sin embargo he intentado un montón de enfoques como la creación de un selector y se establece que está basada estirable en estado y ampliable, como esto:

<?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> 

Pero cuando se derrumbó el grupo que oculta para todos los grupos, incluyendo los que tienen hijos (porque Android reconoció grupos colapsados ​​como vacíos).

¿Algún enfoque mejor para configurar el indicador solo para grupos con niños?


Aquí está mi código.

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"))); 
      } 
     } 
    } 

Respuesta

7

En su xml añadir el folowing a ExpandableListView:

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

Que cada Grupo Ver artículo en su adaptador necesita su indicador interno. Por ejemplo, puede agregar un ImageView en el lado derecho de su .xml.

Luego, en el adaptador que haga lo siguiente:

@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

¿Cómo voy a devolver una vista en un método nulo? heheh Tal vez debería estar en el método 'newGroupView()' ¿correcto? Por cierto, ¿qué es ** viewHolder ** y qué es ** indicator **? – rogcg

+0

lo siento. el regreso fue incorrecto, cierto. en el adaptador de cursor no es necesario devolver la vista: D. Acerca de ViewHolder (un patrón para acelerar las cosas en las listas): http://www.youtube.com/watch?v=wDBM6wVEO70&feature=player_detailpage#t=511s –

+0

Sobre el enlace que está construyendo para hablar sobre ViewHolder. Luego lo explica en http://www.youtube.com/watch?v = wDBM6wVEO70 & feature = player_detailpage # t = 511s –

0

¿Por qué no dejar a los grupos sin hijos?

Cambie su consulta para darle solo grupos que tengan hijos.

+0

Pero quiero mostrar los artículos que no tienen hijos también, pero sólo mostrando el número de contacto, solo una fila sin expandir. – rogcg

2

En su adaptador de su uso en clase:

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

¿Qué es el indicador aquí? –

+0

El indicador es un icono en el lado derecho de ExpandableListView, se ve como V. Muestra el estado de la vista de lista como expandido o colapsado. – kabir

Cuestiones relacionadas