ExpandableListView - Indikator für Gruppen ohne Kinder ausblenden

107

Gibt ExpandableListViewes eine Möglichkeit, den Gruppenindikator für Gruppen ohne Kinder auszublenden?

Gratzi
quelle
1
Zur Verdeutlichung: Gibt es eine Möglichkeit, den Gruppenindikator NUR für Gruppen ohne Kinder auszublenden?
AlleyOOP

Antworten:

110

Versuchen Sie dies >>>

für alle Artikel

 getExpandableListView().setGroupIndicator(null);

In XML

android:groupIndicator="@null"
Amt87
quelle
40
Ich glaube, das wird den groupIndicator für alle Elemente festlegen und nicht nur für diejenigen ohne Kinder.
Ericosg
4
Getestet und funktioniert nicht. Dieses einfache Ausblenden aller Indikatoren hat entweder Kinder oder nicht.
Frusso
2
myExpandableListView.setGroupIndicator (null); arbeitet für mich
Ranjith Kumar
@ericosg gibt es eine Möglichkeit, den Indikator für Gruppen ohne Kind zu verbergen?
KJEjava48
1
Es verbirgt alle Indikatoren, nicht diejenigen ohne Kind.
Sam
88

Das android:groupIndicator Eigenschaft hat einen Status aktiviert, der gezeichnet werden kann. Das heißt, Sie können unterschiedliche Bilder für unterschiedliche Zustände festlegen.

Wenn die Gruppe keine Kinder hat, lautet der entsprechende Status 'state_empty'.

Siehe diese Referenzlinks:

dies und das

Zum state_empty , können Sie ein anderes Bild gesetzt , die nicht verwirrend ist, oder einfach transparente Farbe Display nichts verwenden ...

Fügen Sie diesen Artikel zusammen mit anderen in Ihr Stateful Drawable ein ....

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

Ihre Statelliste kann also folgendermaßen aussehen:

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

Wenn Sie eine ExpandableListActivity verwenden, können Sie den Gruppenindikator in onCreate wie folgt festlegen:

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

Ich habe dies getestet, um zu funktionieren.

Sarwar Erfan
quelle
36
Funktioniert nicht: Getestet in Android 4.0.2 (ICS). Weitere Antworten auf diese Frage finden Sie auf dieser Seite. Es scheint, dass Android die nicht erweiterte Gruppe als leer betrachtet. Setzen Sie einfach den Gruppenindikator auf transparent, fügen Sie Ihrer Gruppenzeile eine imageView hinzu und setzen Sie sie in der getGroupView-Adaptermethode auf das gewünschte Symbol.
Fraggle
1
Dieser Code funktioniert auch bei mir nicht (getestet unter Android 4.4). Eine nicht erweiterte Gruppe wird als leer betrachtet (keine untergeordneten Elemente), sodass das Symbol auf Farbe / transparent gesetzt ist.
Guicara
1
Danke für den Code, aber es sieht aus wie ein Witz: so komplexer Code für eine so einfache Aufgabe?
Antonio Sesto
1
Kaum zu glauben, dass diese Antwort so viele "nützliche" und eine Prämie erhalten hat, während dokumentiert ist, dass zusammengebrochene Gruppen aus Leistungsgründen als leer gelten!
3c71
41

Basierend auf der Antwort von StrayPointer und dem Code aus dem Blog können Sie den Code noch weiter vereinfachen:

Fügen Sie in Ihrer XML das Folgende zu ExpandableListView hinzu:

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

Dann machen Sie im Adapter Folgendes:

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

Mit der setImageResource-Methode erledigen Sie alles mit einem Einzeiler. Sie benötigen die drei Integer-Arrays in Ihrem Adapter nicht. Sie benötigen auch keinen XML-Selektor für den erweiterten und reduzierten Status. Alles wird über Java erledigt.

Außerdem zeigt dieser Ansatz auch den richtigen Indikator an, wenn eine Gruppe standardmäßig erweitert wird, was mit dem Code aus dem Blog nicht funktioniert.

jenzz
quelle
4
Dies soll in der getGroupView()Methode Ihrer BaseExpandableListAdapterImplementierung verwendet werden. Schauen Sie sich diese Beispielimplementierung an .
Jenzz
5
@jenzz Was ist der "Indikator"?
IBunny
Er benutzt das ViewHolderMuster. indicatorist der Variablenname des Ansichtsinhabers.
Guicara
Indikator ist eine Bildansicht. Das Bild, das Sie anzeigen möchten, basiert auf den Zuständen
Ojonugwa Jude Ochalifu
Indikator bezieht sich auf die explist_indicator Imageview in der group_row xml: <? xml?> <LinearLayout android: orientierung = "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 / Gruppenname "android: paddingLeft =" 30px "android: textStyle =" fett "android: textSize =" 16px "/> </ LinearLayout>
Razvan_TK9692
26

Wie in einer anderen Antwort erwähnt, wird das Symbol nicht gezeichnet, da Android eine nicht erweiterte Listengruppe als leer behandelt, selbst wenn die Gruppe untergeordnete Elemente hat.

Dieser Link hat das Problem für mich behoben: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

Grundsätzlich müssen Sie das Standard-Drawable als transparent festlegen, das Drawable als ImageView in Ihre Gruppenansicht verschieben und das Bild in Ihrem Adapter umschalten.

StrayPointer
quelle
12

Verwenden Sie in Ihrem Code einfach die benutzerdefinierte XML-Liste für Gruppen und fügen Sie die ImageView für GroupIndicator ein .

Fügen Sie in Ihrem ExpandableListAdapter die folgenden Arrays hinzu

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

Fügen Sie auch in der ExpandableListAdapter- Methode dieselben Dinge wie unten hinzu

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

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

Mihir Trivedi
quelle
10

In XML

android:groupIndicator="@null"

In ExpandableListAdapter-> getGroupViewfolgenden Code kopieren

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);
      }
}
Saurabh Agarwal
quelle
1
Wie verwende ich DEFAULT Drawables? Es heißt: Symbol 'Gruppierung' kann nicht aufgelöst werden
StNickolay
4

Schlagen Sie mir meine Lösung vor:

1) Standard-Gruppenindikator löschen:

<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;
}
Evgeny Karavashkin
quelle
@ stackoverflow.com/users/4090796/evgeny-karavashkin Was ist "Pfeil nach oben"?
StNickolay
2

Ich wollte nur Mihir Trivedis Antwort verbessern. Sie können dies in getGroupView () platzieren, das sich in der MyExpandableListAdapter-Klasse befindet

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

... und was die Layoutansicht betrifft, so sieht meine group_items.xml so aus

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

Hoffe das hilft ... denk daran, eine positive Bewertung abzugeben

keyboard_kracker22
quelle
1

Verwenden Sie dies, es funktioniert perfekt für mich.

<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>
Asad Rao
quelle
Könnten Sie auch Ihren ExpandableListView-Code veröffentlichen? Dies funktioniert bei mir nicht (der group_indicator wird für Gruppen mit und ohne Kinder angezeigt).
1

Haben Sie versucht, ExpandableListViewdas Attribut zu ändern android:groupIndicator="@null"?

Rajat Gupta
quelle
0

Sie erstellen einfach ein neues XML-Layout mit height = 0 für den ausgeblendeten Gruppenheader. Zum Beispiel ist es '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>

Dann lautet Ihr normales Gruppenheader-Layout '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>

Schließlich aktualisieren Sie einfach die getGroupView-Methode in Ihrer Adapterklasse:

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

WICHTIG : Das Root-Tag der Layoutdateien (versteckt und normal) muss unterschiedlich sein (wie im obigen Beispiel LinearLayout und RelativeLayout).

Tran Hieu
quelle
-3

convertView.setVisibility (View.GONE) sollte den Trick machen.

@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);
        }
Vadym Vikulin
quelle
3
Dies entfernt nur alle Elemente: Liste ist leer -> ich bin traurig :(
Ich
Haben Sie eine Gegenprüfung hinzugefügt? if (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin