2010-11-10 8 views

risposta

84

La proprietà android:groupIndicator accetta un disegno abilitato. Cioè, puoi impostare immagini diverse per stati diversi.

Quando il gruppo non ha figli, lo stato corrispondente è 'state_empty'

Vedi questi link di riferimento:

this e this

Per state_empty, è possibile impostare un'immagine diversa che non è confondere, o, semplicemente, usare il colore trasparente per visualizzare nulla ...

Aggiungi questo articolo nel tuo stato drawable insieme ad altri ....

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

Così, il vostro statelist può essere come questo:

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

Nel caso in cui si utilizza un ExpandableListActivity, è possibile impostare la groupindicator in onCreate come segue:

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

ho testato questo per funzionare.

+31

Non funziona: testato su Android 4.0.2 (ICS). Vedi altre risposte a questa domanda in questa pagina. Sembra che Android consideri il gruppo non espanso come vuoto. Basta impostare l'indicatore di gruppo su trasparente, quindi aggiungere un imageView alla riga del gruppo e nel metodo getGroupView dell'adattatore, impostarlo sull'icona desiderata. – Fraggle

+0

@Fraggle: quando ho provato su 2.2, ha funzionato. –

+0

non funziona per me né su 2.2 – morgwai

23

Come menzionato in una risposta diversa, poiché Android considera un gruppo di elenchi non espanso come vuoto, l'icona non viene disegnata anche se il gruppo ha figli.

Questo link risolto il problema per me: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

In pratica dovete impostare il drawable di default come trasparente, spostare il drawable nella vostra vista del gruppo come un ImageView e commutare l'immagine nel vostro adattatore.

33

in base alla risposta del StrayPointer e il codice dal blog, è possibile semplificare il codice ancora di più:

Nella tua xml aggiungere il seguente per ExpandableListView:

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

Poi nella scheda si fa il seguente:

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

utilizzando il metodo setImageResource si ottiene tutto fatto con un one-liner. Non sono necessari i tre array Integer nell'adattatore. Inoltre, non è necessario un selettore XML per lo stato espanso e compresso. Tutto è fatto tramite Java.

Inoltre, questo approccio visualizza anche l'indicatore corretto quando un gruppo viene espanso per impostazione predefinita, ciò che non funziona con il codice dal blog.

+0

dove posso applicare questo codice? – Karthik

+3

Questo è pensato per essere utilizzato nel metodo 'getGroupView()' della vostra implementazione 'BaseExpandableListAdapter'. Dai un'occhiata a [esempio di implementazione] (http://mylifewithandroid.blogspot.co.uk/2011/06/hiding-group-indicator-for-empty-groups.html). – jenzz

+0

+1 per la tua risposta @Jeans ho già attraversato quel collegamento thnx ... – Karthik

86

Prova questa >>>

per tutti gli elementi

getExpandableListView().setGroupIndicator(null); 

in XML

android:groupIndicator="@null" 
+28

Credo che imposti il ​​groupIndicator per tutti gli elementi e non solo per quelli senza figli. – ericosg

+4

Testato e non funziona. Questo semplice nascondere tutti gli indicatori o ha figli o meno. – frusso

+2

** myExpandableListView.setGroupIndicator (null); ** funziona per me –

0

Utilizzare questo è perfettamente lavorando per me.

<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

Potresti pubblicare anche il tuo codice ExpandableListView? Questo non funziona per me (l'indicatore group_ appare per i gruppi con e senza figli). –

+1

Ho visto questo codice molte volte e non funziona. – Joseph

9

Nel codice basta usare l'XML personalizzato per la lista di gruppo e in che mettere il ImageView per GroupIndicator.

E Aggiungere di seguito gli array in 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 
}; 

anche in metodo ExpandableListAdapter aggiungere stesse cose, come di seguito

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

Riferimento: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html

2

vi proponiamo la mia soluzione:

1) Cancellare groupIndicator default:

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

Semplicemente, si crea un nuovo layout xml con height = 0 per la intestazione di gruppo nascosta. Per esempio, è '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> 

Allora la vostra normale layout dell'intestazione gruppo è '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> 

Infine, è sufficiente aggiornare il metodo getGroupView nella classe Adapter:

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

IMPORTANTE: La tag root dei file di layout (nascosto e normale) m Ust essere diversa (come sopra esempio LinearLayout e RelativeLayout)

0

Hai provato a cambiare ExpandableListView s' attributo android:groupIndicator="@null"?

+0

non per tutti i gruppi. – Ich

-2

convertView.setVisibility (View.GONE) dovrebbe fare il trucco.

@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

Questo rimuove solo tutti gli elementi: Elenco è vuoto -> me è triste :( – Ich

+0

hai aggiunto il controllo contatore? If (getChildrenCount (groupPosition) == 0) { –

0

Volevo solo migliorare la risposta di Mihir Trivedi. È possibile inserire questo all'interno getGroupView() che è dentro di classe 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]); 
      } 
     } 
    } 

... e per quanto riguarda la vista layout, questo è come la mia group_items.xml sembra essere

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

Spero che aiuti ... ricorda di lasciare un upvote