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

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

Свойство android:groupIndicator принимает 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)); 

Я тестировал это, чтобы работать.

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

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

  getExpandableListView().setGroupIndicator(null); 

В xml

 android:groupIndicator="@null" 

На основе ответа 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.

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

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

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

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

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

Это может быть другим способом из XML, set android:groupIndicator="@null"

Ссылка ссылки: https://stackoverflow.com/a/5853520/2624806

Предложите свое решение:

1) Очистить defaultIndicator:

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

Используйте это, он отлично работает для меня.

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

Просто создайте новый макет 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)

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

Просто хотел улучшить ответ Михира Триведи. Вы можете поместить это в 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"/> 

Надеюсь, что это поможет … не забудьте оставить вверх

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