web-dev-qa-db-fra.com

ExpandableListView - indicateur de masquage pour les groupes sans enfants

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

98
Gratzi

Essayez ceci >>>

pour tous les articles

 getExpandableListView().setGroupIndicator(null);

En xml

Android:groupIndicator="@null"
99
Amt87

La propriété Android:groupIndicator prend un état pouvant être dessiné. En d'autres termes, 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:

ceci et ceci

Pour state_empty, vous pouvez définir une image différente qui ne soit pas source de confusion ou simplement utiliser une couleur transparente pour ne rien afficher ...

Ajouter cet article dans votre étatful drawable avec d'autres .... 

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

Donc, votre statelist peut être comme ça:

<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 un 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 travailler.

87
Sarwar Erfan

En vous basant sur la réponse de StrayPointer et sur le 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, 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 un one-liner . Vous n'avez pas besoin des trois tableaux Integer de votre adaptateur. De plus, vous n'avez pas besoin d'un sélecteur XML pour les états développés et réduits. 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.

37
jenzz

Comme indiqué dans une réponse différente, étant donné qu'Android considère un groupe de liste 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 dessin dans votre vue de groupe en tant qu’image Image et basculer l’image dans votre adaptateur.

25
StrayPointer

Dans votre code, utilisez simplement le code XML personnalisé pour la liste de groupes et insérez-y le 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
};

aussi dans la méthode de ExpandableListAdapter 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

11
Mihir Trivedi

cela pourrait être une autre façon de XML, définissez Android:groupIndicator="@null"

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

7
CoDe

vous suggère ma solution:

1) Effacez groupIndicator 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;
}
3

en XML

Android: groupIndicator = "@ null"

dans ExpandableListAdapter -> getGroupView copy 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
Saurabh Agarwal

Vous créez simplement une nouvelle présentation XML avec height = 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, 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, vous venez de mettre à jour la méthode getGroupView dans votre classe Adapter:

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 présentation (caché et normal) doit être différente (comme dans l'exemple ci-dessus, LinearLayout et RelativeLayout)

0
Tran Hieu

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>
0
Asad Rao

Je voulais juste améliorer la réponse de Mihir Trivedi. Vous pouvez placer ceci 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 en ce qui concerne la présentation, voici comment mon groupe_items.xml apparaît

<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érons que cela aide ... n'oubliez pas de laisser un vote positif

0
keyboard_kracker22

Avez-vous essayé de modifier l'attribut ExpandableListView de Android:groupIndicator="@null"?

0
Rajat Gupta