ExpandableListView - показник приховування для груп без дітей


108

В ExpandableListView, є спосіб , щоб приховати індикатор групи для груп без дітей?


1
Для уточнення: чи існує спосіб приховати індикатор групи ТІЛЬКИ для груп, які не мають дітей?
AlleyOOP

Відповіді:


111

Спробуйте це >>>

для всіх предметів

 getExpandableListView().setGroupIndicator(null);

У xml

android:groupIndicator="@null"

40
Я вірю, що встановить групуІндикатор для всіх предметів, а не лише тих, що не мають дітей.
ericosg

4
Тестується і не працює. Це просте приховання всіх показників має дітей чи ні.
frusso

2
myExpandableListView.setGroupIndicator (null); працює для мене
Ранджіт Кумар

@ericosg чи є спосіб приховати індикатор для груп без дитини ??
KJEjava48

1
Він приховує всі показники, не ті, у яких немає дитини.
Сем

88

android:groupIndicatorВластивість приймає стан включена витяжку. Тобто ви можете встановити різні зображення для різних станів.

Якщо в групі немає дітей, відповідний стан - "state_empty"

Дивіться ці посилання:

це і це

Бо state_emptyви можете встановити інше зображення, яке не бентежить, або просто використовувати прозорий колір, щоб нічого не відображати ...

Додайте цей предмет у свій загальнодоступний графік та інші ....

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

Отже, ваш стателіст може бути таким:

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

Якщо ви використовуєте ExpandableListActivity, ви можете встановити groupindicator в onCreate таким чином:

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

Я перевірив, що це працює.


36
Не працює: Тестовано в Android 4.0.2 (ICS). Дивіться інші відповіді на це питання на цій сторінці. Здається, Android вважає нерозширену групу порожньою. Просто встановіть індикатор групи прозорим, а потім додайте imageView у свій груповий рядок та в методі getGroupView адаптера встановіть його на потрібний значок.
Fraggle

1
Цей код також не працює у мене (тестовано на Android 4.4). Розширена група вважається порожньою (немає дітей), тому піктограма встановлена ​​на колір / прозорий.
Гікара

1
Дякую за код, але це виглядає як жарт: настільки складний код для такого простого завдання?
Антоніо Сесто

1
Важко повірити, що ця відповідь отримала стільки «корисного» та щедрості, хоча задокументовано, що розбиті групи вважаються порожніми з міркувань виступу!
3c71

41

На основі відповіді StrayPointer та коду з блогу ви можете ще більше спростити код:

У свій xml додайте наступне для ExpandableListView:

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

Потім у Адаптері виконайте такі дії:

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

Використовуючи метод setImageResource, ви все це зробите за допомогою одного вкладиша. Не потрібно три масиви Integer у вашому адаптері. Також вам не потрібен XML-селектор для розширеного та згорнутого стану. Все робиться через Java.

Плюс цей підхід також відображає правильний показник, коли група за умовчанням розширюється, що не працює з кодом з блогу.


4
Це призначено для використання в getGroupView()методі вашої BaseExpandableListAdapterреалізації. Подивіться на цей приклад реалізації .
jenzz

5
@jenzz Що таке "показник"?
IBunny

Він використовує ViewHolderвізерунок. indicator- ім'я змінної власника перегляду.
Guicara

Індикатор - це Imageview. Зображення, яке ви хочете відобразити на основі станів
Ojonugwa Jude Ochalifu

Індикатор посилається на зображення Explist_indicator Imageview в group_row xml: <? xml?> <LinearLayout android: орієнтація = "горизонтальний" 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 = "@ dravable / extender_group" /> <TextView android: layout_height = "wrap_content" android: layout_width = "fill_parent" android: id = " @ + id / ім'я групи "android: paddingLeft =" 30px "android: textStyle =" жирний "android: textSize =" 16px "/> </LinearLayout>
Razvan_TK9692

26

Як було сказано в іншій відповіді, оскільки Android розглядає нерозширену групу списків як порожню, значок не малюється, навіть якщо в групі є діти.

Це посилання вирішило проблему для мене: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

По суті, ви повинні встановити типовий параметр для малювання як прозорий, перемістити малюнок у груповий вигляд як ImageView та переключити зображення у адаптері.


12

У своєму коді просто використовуйте користувальницький xml для списку груп, а потім додайте ImageView for GroupIndicator .

І додайте нижче масиви у своєму 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
};

також у методі ExpandableListAdapter додайте ті самі речі, що і нижче

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

Довідка: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html


10

У XML

android:groupIndicator="@null"

В ExpandableListAdapter-> getGroupViewскопіюйте наступний код

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
Як користуватися ДЕФАЛЬТНЬОЮ ДРУГОЮ? У ньому написано: Неможливо вирішити символ "групування"
StNickolay


4

пропоную вам моє рішення:

1) Очистити за замовчуванням groupIndicator:

<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) у програмі 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

Просто хотів покращити відповідь Міхіра Триведі. Ви можете розмістити це в getGroupView (), що знаходиться в класі 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]);
            }
        }
    }

... а щодо перегляду макетів, так виглядає мій 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"/>

Сподіваюсь, що це допоможе ... не забудьте залишити нагороду


1

Використовуйте це, воно прекрасно працює для мене.

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

Чи можете ви також опублікувати свій код ExpandableListView? Це не працює для мене (group_indicator з’являється для груп із дітьми та без них).


0

Просто ви створюєте новий макет xml висотою = 0 для прихованого заголовка групи. Наприклад, це "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>

Тоді ваш звичайний макет заголовка групи - "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>

Нарешті, ви просто оновите метод getGroupView у своєму класі адаптерів:

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

ВАЖЛИВО : Кореневий тег файлів макета (прихований і нормальний) повинен бути різним (як вище, наприклад, LinearLayout та RelativeLayout)


-3

convertView.setVisibility (View.GONE) повинен зробити свою справу.

@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
Це просто видаляє всі елементи: Список порожній -> мені сумно :(
Ich

Ви додали зустрічну перевірку? if (getChildrenCount (groupPosition) == 0) {
Вадим Вікулін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.