ExpandableListView montre indicateur de groupes sans enfant
Je suis de la création d'un ExpandableListView
avec des données provenant d'une base de données. Pour cela, je suis en utilisant un CursorTreeAdapter
et je le remplir avec un Cursor
objet qui contient les données que j'ai récupérer à partir de la base de données.
J'ai pensé que, par défaut d'Android serait de considérer les groupes sans enfant "pas extensible".
Cependant, il montre encore l'icône sur la ligne, et quand je clique dessus, il ne fait rien. Je n'en veux pas à afficher cette icône.
Je ne veux que les groupes qui les a childs pour afficher l'icône de développement, ce qui n'est pas le cas. Il montre l'icône de développement pour toutes les lignes (celles avec enfants et sans enfants).
Mise à JOUR
J'ai étudié mon code et j'ai vu que le problème est essentiellement dans la définition de la groupIndicator
pour les groupes. Cependant j'ai essayé beaucoup d'approches, comme la création d'un sélecteur, il est dessiné en fonction de l'état et extensible, comme ceci:
<?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>
Mais lorsque le groupe est effondré il se cache pour tous les groupes, y compris ceux avec des enfants (parce qu'Android a reconnu s'est effondré groupes vide).
À une meilleure approche pour la définition de l'indicateur uniquement pour les groupes avec des enfants?
Voici mon code.
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")));
}
}
}
OriginalL'auteur rogcg | 2012-07-03
Vous devez vous connecter pour publier un commentaire.
Dans votre xml ajouter ce qui suit à ExpandableListView:
Que chaque Élément du Groupe d'Afficher dans votre Adaptateur besoins internes de l'indicateur. Vous pouvez par exemple ajouter une ImageView sur le côté droit de votre .xml.
Puis dans l'Adaptateur, procédez de la manière suivante:
newGroupView()
méthode correcte? BTW, qu'est-ce que viewHolder et qu'est-ce que voyant?désolé. de retour a été de mal, de vrai. dans le curseur de carte pas besoin de retourner la voir :D. Sur ViewHolder (un modèle pour accélérer les choses dans les listes): youtube.com/...
Le lien ci-dessus, il est la construction jusqu'à parler de ViewHolder. Puis il l'explique dans le youtube.com/...
Si ViewHolder est trop compliqué pour l'instant, il suffit d'utiliser la vue.findViewById(...) comme vous l'avez fait avant 😉
OriginalL'auteur Patrick Boos
Dans votre classe d'adaptateur utilisation:
L'indicateur est l'icône sur le côté droit de ExpandableListView ,sa ressemble à V .Ses spectacles état de listview comme développé ou réduit.
OriginalL'auteur Raj Kumar
Pourquoi ne pas laisser les groupes ayant pas d'enfants?
Modifier votre requête afin de vous donner uniquement les groupes qui ont des enfants.
OriginalL'auteur Barak