2010-11-10 2 views

ответ

84

Свойство android:groupIndicator имеет доступное состояние. То есть вы можете установить другое изображение для разных состояний.

Когда группа не имеет детей, то соответствующее состояние «state_empty»

Смотрите эти ссылки ссылки:

this и this

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

Добавить этот элемент в свою форму с выделением вместе с другими ....

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

Таким образом, ваш statelist может быть так:

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

У меня есть испытал это, чтобы работать.

+31

Не работает: протестирован в Android 4.0.2 (ICS). Другие ответы на этот вопрос на этой странице. Похоже, что Android считает нерасширенную группу пустой. Просто установите индикатор группы прозрачным, затем добавьте imageView в свою группу и в метод getGroupView адаптера, установите его в нужную вам иконку. – Fraggle

+0

@Fraggle: Когда я тестировал 2.2, он сработал. –

+0

не работает для меня ни на 2.2 – morgwai

23

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

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

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

33

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

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

+0

Где я могу применить этот код? – Karthik

+3

Это предназначено для использования в методе 'getGroupView()' вашей реализации BaseExpandableListAdapter'. Взгляните на эту [примерную реализацию] (http://mylifewithandroid.blogspot.co.uk/2011/06/hiding-group-indicator-for-empty-groups.html). – jenzz

+0

+1 для ответа на ур @ Jeans Я уже прошел через эту ссылку thnx ... – Karthik

86

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

для всех элементов

getExpandableListView().setGroupIndicator(null); 

В XML

android:groupIndicator="@null" 
+28

Я считаю, что это установит идентификатор groupIndicator для всех элементов, а не только для тех, у кого нет детей. – ericosg

+4

Протестировано и не работает. У этого простого скрыть все индикаторы есть дети или нет. – frusso

+2

** myExpandableListView.setGroupIndicator (null); ** работает для меня –

0

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

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

Не могли бы вы также разместить свой код ExpandableListView? Это не работает для меня (group_indicator появляется для групп с детьми и без них). –

+1

Я видел этот код много раз и не работаю. – Joseph

9

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

2

предложить вам мое решение:

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

0

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

+0

не для всех групп. – Ich

-2

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

Это просто удаляет все элементы: Список пуст -> мне грустно :( – Ich

+0

Вы добавили счетчик проверки? If (getChildrenCount (groupPosition) == 0) { –

0

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

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

Смежные вопросы