Indicateur ExpandableListView-hide pour les groupes sans enfants

Dans un ExpandableListView , est-il un moyen de masquer l'indicateur de groupe pour les groupes ayant pas d'enfants?

94
demandé sur George 2010-11-10 16:45:32

13 réponses

Essayez cette >>>

pour tous les produits

 getExpandableListView().setGroupIndicator(null);

en xml

android:groupIndicator="@null"
97
répondu Amt87 2016-04-27 11:56:39

la propriété android:groupIndicator prend un État a permis de tirer. Qui est, vous pouvez définir une image différente pour les 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, tout simplement utiliser couleur transparente pour ne rien afficher...

ajoutez cet article dans votre dressable à dessin avec d'autres....

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

donc, votre liste 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>

dans le cas où vous utilisez une Activitéexpandable, vous pouvez définir l'indicateur groupindicator dans onCreate comme suit:

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

j'ai testé ce travail.

86
répondu Sarwar Erfan 2015-06-09 06:25:04

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

dans votre xml, ajoutez ce qui suit à ExpandableListView:

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

puis 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 vous obtenez tout fait avec un one-liner. Vous n'avez pas besoin des trois tableaux entiers de votre adaptateur. Vous n'avez pas non plus besoin D'un sélecteur XML pour l'état élargi et s'est effondré. Tout se fait via Java.

Plus, cette approche affiche également l'indicateur correct quand un groupe est étendu par défaut ce qui ne fonctionne pas avec le code du blog.

35
répondu jenzz 2014-02-03 06:13:30

comme mentionné dans une réponse différente, depuis Android traite un groupe de liste non étendu 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

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

24
répondu StrayPointer 2011-08-26 15:38:11

dans votre code il suffit d'utiliser le xml personnalisé pour la liste de groupe et dans cela mettre le ImageView pour GroupIndicator .

et Ajouter ci-dessous 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
};

dans ExpandableListAdapter méthode add (même chose 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
répondu Mihir Trivedi 2014-05-09 09:10:23

cela pourrait être une autre façon de XML, mettre android:groupIndicator="@null"

lien de référence: https://stackoverflow.com/a/5853520/2624806

6
répondu CoDe 2017-05-23 12:10:28

vous suggérez ma solution:

1) indicateur de groupe par défaut clair:

<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 L'adaptation extensible:

@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
répondu Evgeny Karavashkin 2014-10-03 12:23:24

en XML

android: groupIndicator= "@null"

dans ExpandableListAdapter -- > getgroupview copier 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
répondu Saurabh Agarwal 2018-05-20 10:24:13

utilisez ceci il 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>
0
répondu Asad Rao 2013-10-24 11:27:59

il suffit de créer une nouvelle mise en page xml avec height=0 pour l'en-tête de groupe caché. Par exemple, c'est ' 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>

alors la disposition normale de votre 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, il vous suffit 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 (caché et normal) doit être différent (comme ci-dessus, linéaire et relative )

0
répondu Tran Hieu 2014-10-16 15:03:49

avez-vous essayé de changer l'attribut ExpandableListView ?

0
répondu Rajat Gupta 2015-06-12 16:25:39

voulait juste améliorer la réponse de Mihir Trivedi. Vous pouvez le placer dans getGroupView () qui est dans ma classe Expandablelistadapter

    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 pour ce qui est de la vue layout, 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"/>

Espère que ça aide...rappelez-vous de laisser un upvote

0
répondu keyboard_kracker22 2017-02-28 20:35:17

convertView.setVisibility(View.DISPARU) 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);
        }
-2
répondu Vadym Vikulin 2015-12-12 15:02:54