ExpandableListView - Masquer l'indicateur pour les groupes sans enfants


108

Dans un ExpandableListView, existe-t-il un moyen de masquer l'indicateur de groupe pour les groupes sans enfants?


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

Réponses:


111

Essayez ceci >>>

pour tous les articles

 getExpandableListView().setGroupIndicator(null);

En xml

android:groupIndicator="@null"

40
Je crois que cela définira le groupIndicator pour tous les éléments et pas seulement ceux sans enfants.
ericosg

4
Testé et ne fonctionne pas. Ce simple cache tous les indicateurs a des enfants ou non.
frusso

2
myExpandableListView.setGroupIndicator (null); travaille pour moi
Ranjith Kumar

@ericosg existe-t-il un moyen de masquer l'indicateur pour les groupes sans enfant ??
KJEjava48

1
Il cache tous les indicateurs pas ceux sans enfant.
Sam

88

La android:groupIndicatorpropriété prend un état activé drawable. Autrement dit, 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 cela

Car 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 dessin avec état avec d'autres ....

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

Ainsi, votre liste de statistiques 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é cela pour fonctionner.


36
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 développé comme vide. Définissez simplement l'indicateur de groupe sur transparent, puis ajoutez un imageView à votre ligne de groupe et dans la méthode getGroupView de l'adaptateur, définissez-le sur l'icône de votre choix.
Fraggle

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

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

1
Difficile de croire que cette réponse a reçu autant d '«utiles» et une prime alors qu'il est documenté que les groupes réduits sont considérés comme vides pour des raisons de performances!
3c71

41

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 les éléments suivants à ExpandableListView:

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

Ensuite, dans l'adaptateur, vous procédez comme 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, vous obtenez tout cela avec une seule ligne. Vous n'avez pas besoin des trois tableaux Integer de votre adaptateur. Vous n'avez pas non plus besoin d'un sélecteur XML pour l'état développé et réduit. Tout se fait via Java.

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


4
Ceci est destiné à être utilisé dans la getGroupView()méthode de votre BaseExpandableListAdapterimplémentation. Jetez un œil à cet exemple d'implémentation .
jenzz du

5
@jenzz Qu'est-ce que "l'indicateur"?
IBunny

Il utilise le ViewHoldermodèle. indicatorest le nom de variable du détenteur de la vue.
Guicara

l'indicateur est une imageview.L'image que vous souhaitez afficher en fonction des états
Ojonugwa Jude Ochalifu

l'indicateur fait référence à l'explist_indicator Imageview dans le group_row xml: <? xml?> <LinearLayout android: orientation = "horizontal" android: layout_height = "wrap_content" android: layout_width = "fill_parent"> <ImageView android: layout_height = "20px" android : layout_width = "20px" android: id = "@ + id / explist_indicator" android: src = "@ drawable / expander_group" /> <TextView android: layout_height = "wrap_content" android: layout_width = "fill_parent" android: id = " @ + id / groupname "android: paddingLeft =" 30px "android: textStyle =" bold "android: textSize =" 16px "/> </LinearLayout>
Razvan_TK9692

26

Comme mentionné dans une réponse différente, étant donné qu'Android traite un groupe de listes non développé comme vide, l'icône n'est pas dessiné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

Fondamentalement, vous devez définir le dessin 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.


12

Dans votre code il suffit d' utiliser le code XML personnalisé pour la liste des groupes et qui a mis le ImageView pour GroupIndicator .

Et ajoutez ci-dessous les tableaux 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 la méthode de ExpandableListAdapter, ajoutez 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


10

En XML

android:groupIndicator="@null"

Dans ExpandableListAdapter-> getGroupViewcopier le code suivant

if (this.mListDataChild.get(this.mListDataHeader.get(groupPosition)).size() > 0){
      if (isExpanded) {
          arrowicon.setImageResource(R.drawable.group_up);
      } else {
          arrowicon.setImageResource(R.drawable.group_down);
      }
}

1
Comment utiliser les drawables DEFAULT? Il dit: Impossible de résoudre le symbole «group-up»
StNickolay


4

vous propose ma solution:

1) Effacer l'indicateur de groupe par défaut:

<ExpandableListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"       
    android:layout_width="wrap_content"
    android:layout_height="240dp"        
    android:layout_gravity="start"
    android:background="#cccc"  
    android:groupIndicator="@android:color/transparent"     
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"        
    android:dividerHeight="0dp"  
     />

2) dans ExpandableAdapter:

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = new TextView(context);
    }
    ((TextView) convertView).setText(groupItem.get(groupPosition));     
    ((TextView) convertView).setHeight(groupHeight);
    ((TextView) convertView).setTextSize(groupTextSize);

    //create groupIndicator using TextView drawable
    if (getChildrenCount(groupPosition)>0) {
        Drawable zzz ;
        if (isExpanded) {
            zzz = context.getResources().getDrawable(R.drawable.arrowup);
        } else {
            zzz = context.getResources().getDrawable(R.drawable.arrowdown);
        }                               
        zzz.setBounds(0, 0, groupHeight, groupHeight);
        ((TextView) convertView).setCompoundDrawables(null, null,zzz, null);
    }       
    convertView.setTag(groupItem.get(groupPosition));       

    return convertView;
}


2

Je voulais juste améliorer la réponse de Mihir Trivedi. Vous pouvez le placer dans getGroupView () qui se trouve dans la classe MyExpandableListAdapter

    View ind = convertView.findViewById(R.id.group_indicator);
    View ind2 = convertView.findViewById(R.id.group_indicator2);
    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);

            /*toggles down button to change upwards when list has expanded*/
            if(stateSetIndex == 1){
                ind.setVisibility(View.INVISIBLE);
                ind2.setVisibility(View.VISIBLE);
                Drawable drawable = indicator.getDrawable();
                drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
            }
            else if(stateSetIndex == 0){
                ind.setVisibility(View.VISIBLE);
                ind2.setVisibility(View.INVISIBLE);
                Drawable drawable = indicator.getDrawable();
                drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
            }
        }
    }

... et comme pour la mise en page, voici comment mon group_items.xml semble être

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/group_heading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="20dp"
    android:paddingTop="16dp"
    android:paddingBottom="16dp"
    android:textSize="15sp"
    android:textStyle="bold"/>

<ImageView
    android:id="@+id/group_indicator"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/arrow_down_float"
    android:layout_alignParentRight="true"
    android:paddingRight="20dp"
    android:paddingTop="20dp"/>

<ImageView
    android:id="@+id/group_indicator2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/arrow_up_float"
    android:layout_alignParentRight="true"
    android:visibility="gone"
    android:paddingRight="20dp"
    android:paddingTop="20dp"/>

J'espère que cela aide ... n'oubliez pas de laisser un vote favorable


1

Utilisez ceci, cela fonctionne parfaitement pour moi.

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/group_indicator_expanded" android:state_empty="false" android:state_expanded="true"/>
<item android:drawable="@drawable/group_indicator" android:state_empty="true"/>
<item android:drawable="@drawable/group_indicator"/>

</selector>

Pourriez-vous également publier votre code ExpandableListView? Cela ne fonctionne pas pour moi (l'indicateur group_indicator apparaît pour les groupes avec et sans enfants).

1

Avez-vous essayé de changer ExpandableListViewl'attribut de android:groupIndicator="@null"?


0

Vous créez simplement une nouvelle mise en page XML avec hauteur = 0 pour l'en-tête de groupe masqué. Par exemple, il s'agit de «group_list_item_empty.xml»

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"              
              android:layout_width="match_parent"
              android:layout_height="0dp">
</RelativeLayout>

Ensuite, votre disposition normale d'en-tête de groupe est «your_group_list_item_file.xml»

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="48dp"
              android:orientation="horizontal">
    ...your xml layout define...
</LinearLayout>

Enfin, vous venez de mettre à jour la méthode getGroupView dans votre classe d'adaptateur:

public class MyExpandableListAdapter extends BaseExpandableListAdapter{   

    //Your code here ...

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) {
        if (Your condition to hide the group header){
            if (convertView == null || convertView instanceof LinearLayout) {
                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = mInflater.inflate(R.layout.group_list_item_empty, null);
            }           
            return convertView;
        }else{      
            if (convertView == null || convertView instanceof RelativeLayout) {
                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = mInflater.inflate(R.layout.your_group_list_item_file, null);              
            }   
            //Your code here ...
            return convertView;
        }
    }
}

IMPORTANT : la balise racine des fichiers de mise en page (masqué et normal) doit être différente (comme dans l'exemple ci-dessus, LinearLayout et RelativeLayout)


-3

convertView.setVisibility (View.GONE) devrait faire l'affaire.

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    DistanceHolder holder;
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.list_search_distance_header, parent, false);
        if (getChildrenCount(groupPosition)==0) {
            convertView.setVisibility(View.GONE);
        }

3
Cela supprime simplement tous les éléments: La liste est vide -> moi est triste :(
Ich

avez-vous ajouté un chèque de compteur? if (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.