Risposte:
Prova questo >>>
per tutti gli articoli
getExpandableListView().setGroupIndicator(null);
In xml
android:groupIndicator="@null"
La android:groupIndicator
proprietà assume uno stato abilitato disegnabile. Cioè, puoi impostare un'immagine diversa per stati diversi.
Quando il gruppo non ha figli, lo stato corrispondente è "state_empty"
Vedi questi link di riferimento:
Infatti state_empty
, puoi impostare un'immagine diversa che non sia fonte di confusione o, semplicemente usare un colore trasparente per non visualizzare nulla ...
Aggiungi questo elemento nel tuo disegnabile stateful insieme ad altri ....
<item android:state_empty="true" android:drawable="@android:color/transparent"/>
Quindi, il tuo elenco delle statistiche può essere così:
<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 utilizzi un ExpandableListActivity, puoi impostare l'indicatore di gruppo in onCreate come segue:
getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist));
L'ho testato per funzionare.
Sulla base della risposta di StrayPointer e del codice del blog, puoi semplificare ulteriormente il codice:
Nel tuo xml aggiungi quanto segue a ExpandableListView:
android:groupIndicator="@android:color/transparent"
Quindi nell'adattatore fai quanto segue:
@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 );
}
}
Usando il metodo setImageResource ottieni tutto con una riga. Non sono necessari i tre array Integer nell'adattatore. Inoltre, non è necessario un selettore XML per lo stato espanso e compresso. Tutto viene eseguito tramite Java.
Inoltre, questo approccio mostra anche l'indicatore corretto quando un gruppo viene espanso per impostazione predefinita cosa non funziona con il codice del blog.
getGroupView()
metodo di BaseExpandableListAdapter
implementazione. Dai un'occhiata a questo esempio di implementazione .
ViewHolder
schema. indicator
è il nome della variabile del titolare della vista.
Come accennato 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 collegamento ha risolto il problema per me: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html
Fondamentalmente devi impostare il drawable predefinito come trasparente, spostare il drawable nella tua vista di gruppo come ImageView e attivare / disattivare l'immagine nel tuo adattatore.
Nel tuo codice usa solo l'xml personalizzato per l'elenco dei gruppi e in questo inserisci ImageView per GroupIndicator .
E aggiungi sotto gli array nel tuo 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 nel metodo ExpandableListAdapter aggiungi le stesse cose come sotto
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
In XML
android:groupIndicator="@null"
In ExpandableListAdapter
-> getGroupView
copia il seguente codice
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);
}
}
questo potrebbe essere un altro modo da XML, set android:groupIndicator="@null"
Link di riferimento: https://stackoverflow.com/a/5853520/2624806
ti suggerisco la mia soluzione:
1) Cancella l'indicatore di gruppo predefinito:
<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;
}
Volevo solo migliorare la risposta di Mihir Trivedi. Puoi posizionarlo all'interno di getGroupView () all'interno della 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 visualizzazione del layout, questo è come appare il mio 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"/>
Spero che questo aiuti ... ricordati di lasciare un voto positivo
Usa questo per me funziona perfettamente.
<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>
Hai provato a cambiare ExpandableListView
l'attributo di android:groupIndicator="@null"
?
Semplicemente, crei un nuovo layout xml con altezza = 0 per l'intestazione del gruppo nascosto. Ad 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>
Quindi il layout normale dell'intestazione del 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, aggiorna il metodo getGroupView nella tua 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 : il tag radice dei file di layout (nascosto e normale) deve essere diverso (come nell'esempio precedente, LinearLayout e RelativeLayout)
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);
}