ExpandableListView - ukryj wskaźnik dla grup bez dzieci

108

Czy ExpandableListViewistnieje sposób na ukrycie wskaźnika grupy dla grup bez dzieci?

Gratzi
źródło
1
Wyjaśnienie: Czy istnieje sposób na ukrycie wskaźnika grupy TYLKO dla grup bez dzieci?
AlleyOOP,

Odpowiedzi:

111

Spróbuj tego >>>

dla wszystkich przedmiotów

 getExpandableListView().setGroupIndicator(null);

W xml

android:groupIndicator="@null"
Amt87
źródło
40
Wierzę, że to wyznaczy GroupIndicator dla wszystkich pozycji, a nie tylko tych bez dzieci.
ericosg
4
Przetestowane i nie działa. Ta prosta funkcja ukrywania wszystkich wskaźników ma dzieci lub nie.
frusso
2
myExpandableListView.setGroupIndicator (null); pracuje dla mnie
Ranjith Kumar
@ericosg czy istnieje sposób na ukrycie wskaźnika dla grup bez dziecka?
KJEjava48
1
Ukrywa wszystkie wskaźniki, a nie te bez dziecka.
Sam,
88

android:groupIndicatorNieruchomość trwa stan włączony rozciągliwej. Oznacza to, że możesz ustawić inny obraz dla różnych stanów.

Gdy grupa nie ma dzieci, odpowiedni stan to „state_empty”

Zobacz te linki referencyjne:

to i to

Do state_empty, można ustawić inny obraz, który nie jest skomplikowane, albo po prostu użyć kolor przezroczysty na wyświetlaczu nic ...

Dodaj ten element do swojego stanowego rysunku wraz z innymi ....

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

Twoja statystyka może wyglądać następująco:

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

Jeśli używasz ExpandableListActivity, możesz ustawić wskaźnik grupy w onCreate w następujący sposób:

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

Przetestowałem to, aby działało.

Sarwar Erfan
źródło
36
Nie działa: przetestowano w systemie Android 4.0.2 (ICS). Zobacz inne odpowiedzi na to pytanie na tej stronie. Wygląda na to, że Android uważa nierozwiniętą grupę za pustą. Po prostu ustaw wskaźnik grupy na przezroczysty, a następnie dodaj imageView do wiersza grupy, aw metodzie getGroupView adaptera ustaw go na żądaną ikonę.
Fraggle
1
Ten kod również u mnie nie działa (testowany na Androidzie 4.4). Rozwinięta grupa jest uważana za pustą (brak dzieci), więc ikona jest ustawiona na kolor / przezroczysta.
Guicara,
1
Dzięki za kod, ale wygląda to na żart: tak złożony kod do tak prostego zadania?
Antonio Sesto,
1
Trudno uwierzyć, że ta odpowiedź otrzymała tak wiele „przydatnych” i nagród, podczas gdy jest udokumentowane, że upadłe grupy są uważane za puste ze względu na wydajność!
3c71
41

Bazując na odpowiedzi StrayPointer i kodzie z bloga, możesz jeszcze bardziej uprościć kod:

W swoim xml dodaj do ExpandableListView:

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

Następnie w adapterze wykonujesz następujące czynności:

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

Używając metody setImageResource, osiągniesz to wszystko za pomocą jednej linijki. W adapterze nie są potrzebne trzy tablice liczb całkowitych. Nie potrzebujesz także selektora XML dla stanu rozwiniętego i zwiniętego. Wszystko odbywa się za pośrednictwem języka Java.

Ponadto takie podejście wyświetla również prawidłowy wskaźnik, gdy grupa jest domyślnie rozwinięta, co nie działa z kodem z bloga.

jenzz
źródło
4
Ma to być używane w getGroupView()metodzie BaseExpandableListAdapterimplementacji. Spójrz na tę przykładową implementację .
jenzz,
5
@jenzz Co to jest „wskaźnik”?
IBunny
Używa ViewHolderwzoru. indicatorto nazwa zmiennej posiadacza widoku.
Guicara,
wskaźnik jest Imageview.The obraz chcesz wyświetlić na podstawie stanów
Ojonugwa Jude Ochalifu
wskaźnik odnosi się do explist_indicator Imageview w group_row xml: <? xml?> <LinearLayout android: orientacja = "poziome" 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

Jak wspomniano w innej odpowiedzi, ponieważ system Android traktuje nierozwiniętą grupę list jako pustą, ikona nie jest rysowana, nawet jeśli grupa ma dzieci.

Ten link rozwiązał problem za mnie: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

Zasadniczo musisz ustawić domyślny element do rysowania jako przezroczysty, przenieść element do rysowania do widoku grupy jako ImageView i przełączyć obraz w adapterze.

StrayPointer
źródło
12

W swoim kodzie po prostu użyj niestandardowego kodu XML dla listy grup i umieść w nim ImageView dla GroupIndicator .

I dodaj poniższe tablice do 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
};

również w metodzie ExpandableListAdapter dodaj te same rzeczy, co poniżej

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ódła: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html

Mihir Trivedi
źródło
10

W XML

android:groupIndicator="@null"

W ExpandableListAdapter-> getGroupViewskopiuj następujący kod

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
źródło
1
Jak używać DEFAULT drawables? Mówi: Nie można rozwiązać symbolu „grupowania”
StNickolay
4

proponuję moje rozwiązanie:

1) Wyczyść domyślną grupę Wskaźnik:

<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) w 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
źródło
@ stackoverflow.com/users/4090796/evgeny-karavashkin co to jest „arrowup”?
StNickolay
2

Chciałem tylko poprawić odpowiedź Mihira Trivediego. Możesz to umieścić w getGroupView (), który znajduje się w klasie 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]);
            }
        }
    }

... a co do widoku układu, tak wygląda mój 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"/>

Mam nadzieję, że to pomoże ... pamiętaj, aby zostawić głos za

keyboard_kracker22
źródło
1

Użyj tego, że działa idealnie dla mnie.

<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
źródło
Czy możesz również opublikować swój kod ExpandableListView? To nie działa dla mnie (group_indicator pojawia się dla grup z dziećmi i bez).
1

Czy próbowałeś zmienić ExpandableListViewatrybut android:groupIndicator="@null"?

Rajat Gupta
źródło
0

Po prostu utwórz nowy układ XML z wysokością = 0 dla ukrytego nagłówka grupy. Na przykład jest to „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>

Wtedy twój normalny układ nagłówka grupy to „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>

Na koniec wystarczy zaktualizować metodę getGroupView w klasie adaptera:

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

WAŻNE : Znacznik główny plików układu (ukryty i normalny) musi być inny (jak w powyższym przykładzie, LinearLayout i RelativeLayout)

Tran Hieu
źródło
-3

ConvertView.setVisibility (View.GONE) powinno załatwić sprawę.

@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
źródło
3
To tylko usuwa wszystkie pozycje: Lista jest pusta -> ja jest smutny :(
Ich
czy dodałeś sprawdzenie licznika? if (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin