ExpandableListView: nasconde l'indicatore per i gruppi senza figli


108

In an ExpandableListView, c'è un modo per nascondere l'indicatore di gruppo per i gruppi senza figli?


1
Per chiarire: c'è un modo per nascondere l'indicatore di gruppo SOLO per i gruppi senza bambini?
AlleyOOP

Risposte:


111

Prova questo >>>

per tutti gli articoli

 getExpandableListView().setGroupIndicator(null);

In xml

android:groupIndicator="@null"

40
Credo che imposterà groupIndicator per tutti gli elementi e non solo per quelli senza figli.
ericosg

4
Testato e non funziona. Questo semplice nascondere tutti gli indicatori ha figli o no.
frusso

2
myExpandableListView.setGroupIndicator (null); lavora per me
Ranjith Kumar,

@ericosg c'è un modo per nascondere l'indicatore per i gruppi senza figli ??
KJEjava48

1
Nasconde tutti gli indicatori non quelli senza figli.
Sam

88

La android:groupIndicatorproprietà assume uno stato abilitato disegnabile. Cioè, puoi impostare un'immagine diversa per stati diversi.

Quando il gruppo non ha figli, lo stato corrispondente è "state_empty"

Vedi questi link di riferimento:

questo e questo

Infatti state_empty, puoi impostare un'immagine diversa che non sia fonte di confusione o, semplicemente usare un colore trasparente per non visualizzare nulla ...

Aggiungi questo elemento nel tuo disegnabile stateful insieme ad altri ....

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

Quindi, il tuo elenco delle statistiche può essere così:

<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>

Nel caso in cui utilizzi un ExpandableListActivity, puoi impostare l'indicatore di gruppo in onCreate come segue:

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

L'ho testato per funzionare.


36
Non funziona: testato in Android 4.0.2 (ICS). Vedi altre risposte a questa domanda in questa pagina. Sembra che Android consideri il gruppo non espanso come vuoto. Basta impostare l'indicatore di gruppo su trasparente, quindi aggiungere un imageView alla riga del gruppo e nel metodo dell'adattatore getGroupView, impostarlo sull'icona desiderata.
Fraggle

1
Questo codice non funziona neanche da me (testato su Android 4.4) .Il gruppo di nonpanded è considerato vuoto (nessun figlio) quindi l'icona è impostata su colore / trasparente.
Guicara

1
Grazie per il codice, ma sembra uno scherzo: codice così complesso per un'attività così semplice?
Antonio Sesto

1
Difficile credere che questa risposta abbia ricevuto così tanti "utili" e una taglia mentre è documentato che i gruppi collassati sono considerati vuoti per motivi di prestazioni!
3c71

41

Sulla base della risposta di StrayPointer e del codice del blog, puoi semplificare ulteriormente il codice:

Nel tuo xml aggiungi quanto segue a ExpandableListView:

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

Quindi nell'adattatore fai quanto segue:

@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 );
    }
}

Usando il metodo setImageResource ottieni tutto con una riga. Non sono necessari i tre array Integer nell'adattatore. Inoltre, non è necessario un selettore XML per lo stato espanso e compresso. Tutto viene eseguito tramite Java.

Inoltre, questo approccio mostra anche l'indicatore corretto quando un gruppo viene espanso per impostazione predefinita cosa non funziona con il codice del blog.


4
Questo deve essere utilizzato nel getGroupView()metodo di BaseExpandableListAdapterimplementazione. Dai un'occhiata a questo esempio di implementazione .
jenzz

5
@jenzz Cos'è l '"indicatore"?
IBunny

Usa lo ViewHolderschema. indicatorè il nome della variabile del titolare della vista.
Guicara

L'indicatore è un Imageview. L'immagine che si desidera visualizzare in base agli stati
Ojonugwa Jude Ochalifu

L'indicatore si riferisce a Explist_indicator Imageview in group_row xml: <? xml?> <LinearLayout android: Orientamento = "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

Come accennato in una risposta diversa, poiché Android considera un gruppo di elenchi non espanso come vuoto, l'icona non viene disegnata anche se il gruppo ha figli.

Questo collegamento ha risolto il problema per me: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

Fondamentalmente devi impostare il drawable predefinito come trasparente, spostare il drawable nella tua vista di gruppo come ImageView e attivare / disattivare l'immagine nel tuo adattatore.


12

Nel tuo codice usa solo l'xml personalizzato per l'elenco dei gruppi e in questo inserisci ImageView per GroupIndicator .

E aggiungi sotto gli array nel tuo 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
};

anche nel metodo ExpandableListAdapter aggiungi le stesse cose come sotto

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;
}

Riferimento: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html


10

In XML

android:groupIndicator="@null"

In ExpandableListAdapter-> getGroupViewcopia il seguente codice

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
Come usare i drawable DEFAULT? Dice: Impossibile risolvere il simbolo "gruppo"
StNickolay


4

ti suggerisco la mia soluzione:

1) Cancella l'indicatore di gruppo predefinito:

<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) in 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

Volevo solo migliorare la risposta di Mihir Trivedi. Puoi posizionarlo all'interno di getGroupView () all'interno della 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]);
            }
        }
    }

... e per quanto riguarda la visualizzazione del layout, questo è come appare il mio group_items.xml

<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"/>

Spero che questo aiuti ... ricordati di lasciare un voto positivo


1

Usa questo per me funziona perfettamente.

<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>

Potresti pubblicare anche il tuo codice ExpandableListView? Questo non funziona per me (il group_indicator appare per i gruppi con e senza bambini).

1

Hai provato a cambiare ExpandableListViewl'attributo di android:groupIndicator="@null"?


0

Semplicemente, crei un nuovo layout xml con altezza = 0 per l'intestazione del gruppo nascosto. Ad esempio, è "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>

Quindi il layout normale dell'intestazione del gruppo è "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>

Infine, aggiorna il metodo getGroupView nella tua 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;
        }
    }
}

IMPORTANTE : il tag radice dei file di layout (nascosto e normale) deve essere diverso (come nell'esempio precedente, LinearLayout e RelativeLayout)


-3

convertView.setVisibility (View.GONE) dovrebbe fare il trucco.

@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
Questo rimuove solo tutti gli elementi: L'elenco è vuoto -> sono triste :(
Ich

hai aggiunto il controllo del contatore? if (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.