ExpandableListView - скрыть индикатор для групп без детей

108

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

Граци
источник
1
Уточнение: есть ли способ скрыть индикатор группы ТОЛЬКО для групп без детей?
AlleyOOP

Ответы:

111

Попробуйте это >>>

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

 getExpandableListView().setGroupIndicator(null);

В xml

android:groupIndicator="@null"
Amt87
источник
40
Я считаю, что это установит groupIndicator для всех элементов, а не только для тех, у кого нет детей.
ericosg 06
4
Проверено и не работает. Это простое скрытие всех индикаторов либо имеет дочерние элементы, либо нет.
frusso
2
myExpandableListView.setGroupIndicator (ноль); у меня работает
Ранджит Кумар
@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, вы можете установить групповой индикатор в onCreate следующим образом:

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

Я проверил, что это работает.

Сарвар Эрфан
источник
36
Не работает: Проверено в Android 4.0.2 (ICS). Смотрите другие ответы на этот вопрос на этой странице. Похоже, Android считает неразвернутую группу пустой. Просто установите индикатор группы на прозрачный, затем добавьте imageView в строку своей группы и в методе адаптера getGroupView установите для него нужный значок.
Fraggle
1
Этот код тоже не работает у меня (проверено на Android 4.4). Нерасширенная группа считается пустой (без дочерних), поэтому для значка установлен цветной / прозрачный.
Guicara 05
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, вы все делаете однострочно. Вам не нужны три целочисленных массива в вашем адаптере. Вам также не нужен селектор XML для развернутого и свернутого состояния. Все делается через Java.

Кроме того, этот подход также отображает правильный индикатор при расширении группы по умолчанию, что не работает с кодом из блога.

Дженз
источник
4
Это предназначено для использования в getGroupView()методе вашей BaseExpandableListAdapterреализации. Взгляните на этот пример реализации .
jenzz
5
@jenzz Что такое "индикатор"?
IBunny
Он использует ViewHolderвыкройку. indicatorэто имя переменной держателя представления.
Guicara 05
индикатор - это Imageview. изображение, которое вы хотите отображать в зависимости от состояний,
Ojonugwa Jude Ochalifu
индикатор ссылается на Explist_indicator Imageview в group_row xml: <? xml?> <LinearLayout android: direction = "horizontal" android: layout_height = "wrap_content" android: layout_width = "fill_parent"> <ImageView android: layout_height = "20px" android : layout_width = "20px" android: id = "@ + id / Expander_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

Как упоминалось в другом ответе, поскольку Android рассматривает группу нерасширенного списка как пустую, значок не отображается, даже если у группы есть дочерние элементы.

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

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

StrayPointer
источник
12

В вашем коде просто используйте пользовательский xml для списка групп и поместите ImageView для 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

Михир Триведи
источник
11

В 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;
}
Евгений Каравашкин
источник
@ stackoverflow.com/users/4090796/evgeny-karavashkin что такое "стрелка вверх"?
StNickolay,
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"/>

Надеюсь, это поможет ... не забудьте оставить свой голос

keyboard_kracker22
источник
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 отображается для групп с детьми и без них).
1

Вы пытались изменить ExpandableListViewатрибут android:groupIndicator="@null"?

Раджат Гупта
источник
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) {
Вадим Викулин