113 votes

ExpandableListView - cacher l'indicateur pour les groupes sans enfants

Dans un ExpandableListView Est-ce qu'il y a un moyen de cacher l'indicateur de groupe pour les groupes sans enfants ?

1 votes

Pour clarifier : existe-t-il un moyen de masquer l'indicateur de groupe UNIQUEMENT pour les groupes sans enfants ?

117voto

Amt87 Points 872

Essayez ceci >>>

pour tous les articles

 getExpandableListView().setGroupIndicator(null);

En xml

android:groupIndicator="@null"

40 votes

Je pense que cela va définir le groupIndicator pour tous les éléments et pas seulement ceux sans enfants.

4 votes

Testé et ne fonctionne pas. Ce simple indicateur "hide all" a des enfants ou pas.

2 votes

myExpandableListView.setGroupIndicator(null) ; fonctionne pour moi

88voto

Sarwar Erfan Points 11946

Le site android:groupIndicator prend un dessinateur dont l'état est activé. C'est-à-dire que vous pouvez définir une image différente pour différents états.

Lorsque le groupe n'a pas d'enfants, l'état correspondant est "state_empty".

Voir ces liens de référence :

ce et ce

Pour state_empty vous pouvez définir une image différente qui ne prête pas à confusion, ou simplement utiliser une couleur transparente pour ne rien afficher...

Ajoutez cet élément dans votre tableau d'état avec d'autres....

<item android:state_empty="true" android:drawable="@android:color/transparent"/>

Ainsi, votre liste de statuts peut être comme ceci :

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_empty="true" android:drawable="@android:color/transparent"/>
    <item android:state_expanded="true" android:drawable="@drawable/my_icon_max" />
    <item android:drawable="@drawable/my_icon_min" />
</selector>

Si vous utilisez une ExpandableListActivity, vous pouvez définir l'indicateur de groupe dans onCreate comme suit :

getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist));

J'ai testé que cela fonctionne.

36 votes

Ne fonctionne pas : Testé sous Android 4.0.2 (ICS). Voir les autres réponses à cette question sur cette page. Il semble qu'Android considère le groupe non étendu comme vide. Il suffit de définir l'indicateur de groupe sur transparent, puis d'ajouter un imageView à votre ligne de groupe et, dans la méthode getGroupView de l'adaptateur, de le définir sur l'icône que vous souhaitez.

1 votes

Ce code ne fonctionne pas pour moi non plus (testé sur Android 4.4). Le groupe non étendu est considéré comme vide (pas d'enfants) donc l'icône est définie en couleur/transparent.

1 votes

Merci pour le code, mais cela ressemble à une blague : un code si complexe pour une tâche si simple ?

43voto

jenzz Points 2944

Sur la base de la réponse de StrayPointer et du code du blog, vous pouvez simplifier encore plus le code :

Dans votre xml, ajoutez ce qui suit à ExpandableListView :

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

Ensuite, dans l'adaptateur, vous faites ce qui suit :

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

    if ( getChildrenCount( groupPosition ) == 0 ) {
       indicator.setVisibility( View.INVISIBLE );
    } else {
       indicator.setVisibility( View.VISIBLE );
       indicator.setImageResource( isExpanded ? R.drawable.list_group_expanded : R.drawable.list_group_closed );
    }
}

En utilisant la méthode setImageResource, tout se fait en une seule ligne. Vous n'avez pas besoin des trois tableaux d'entiers dans votre adaptateur. Vous n'avez pas non plus besoin d'un sélecteur XML pour les états expanded et collapsed. Tout se fait via Java.

De plus, cette approche affiche également le bon indicateur lorsqu'un groupe est développé par défaut, ce qui ne fonctionne pas avec le code du blog.

4 votes

Il est destiné à être utilisé dans le getGroupView() de votre BaseExpandableListAdapter mise en œuvre. Jetez un coup d'œil à ce qui suit exemple de mise en œuvre .

5 votes

@jenzz Quel est l'"indicateur" ?

0 votes

Il utilise le ViewHolder modèle. indicator est le nom de la variable du support de vue.

26voto

StrayPointer Points 869

Comme indiqué dans une autre réponse, Android considère qu'un groupe de listes non développées est vide, l'icône n'est pas affichée même si le groupe a des enfants.

Ce lien a résolu le problème pour moi : http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

En gros, vous devez définir le dessinable par défaut comme transparent, déplacer le dessinable dans votre vue de groupe en tant qu'ImageView et basculer l'image dans votre adaptateur.

12voto

Mihir Trivedi Points 425

Dans votre code, il suffit d'utiliser le xml personnalisé pour la liste des groupes et d'y placer l'élément suivant ImageView pour GroupIndicator .

Et ajoutez les tableaux ci-dessous dans votre ExpandableListAdapter

private static final int[] EMPTY_STATE_SET = {};
private static final int[] GROUP_EXPANDED_STATE_SET = { android.R.attr.state_expanded };
private static final int[][] GROUP_STATE_SETS = { EMPTY_STATE_SET, // 0
GROUP_EXPANDED_STATE_SET // 1
};

également dans L'objet de l'ExpandableListAdapter est le suivant ajouter les mêmes choses que ci-dessous

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) 
{ 
    if (convertView == null) 
    {
        LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.row_group_list, null);
    }

    //Image view which you put in row_group_list.xml
    View ind = convertView.findViewById(R.id.iv_navigation);
    if (ind != null)
    {
        ImageView indicator = (ImageView) ind;
        if (getChildrenCount(groupPosition) == 0) 
        {
            indicator.setVisibility(View.INVISIBLE);
        } 
        else 
        {
            indicator.setVisibility(View.VISIBLE);
            int stateSetIndex = (isExpanded ? 1 : 0);
            Drawable drawable = indicator.getDrawable();
            drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
        }
    }

    return convertView;
}

Référence : http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X