studio recyclerview item expandablelist ejemplo desplegable cardview android android-listview expandablelistview

recyclerview - expandablelistview android ejemplo



ExpandableListView: oculte el indicador para grupos sin hijos (13)

En una ExpandableListView , ¿hay alguna manera de ocultar el indicador de grupo para grupos sin hijos?


¿Has intentado cambiar el atributo de ExpandableListView android:groupIndicator="@null" ?


Como se menciona en una respuesta diferente, dado que Android trata un grupo de lista sin expandir como vacío, el ícono no se dibuja incluso si el grupo tiene hijos.

Este enlace me solucionó el problema: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

Básicamente, debe establecer el dibujable predeterminado como transparente, mover el dibujable a su vista de grupo como una Vista de imagen y alternar la imagen en su adaptador.


En su código solo use el xml personalizado para la lista de grupos y en eso ponga ImageView para GroupIndicator .

Y añada matrices debajo en su 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 };

también en el método ExpandableListAdapter agregue las mismas cosas que a continuación

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

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


La propiedad android:groupIndicator toma un estado habilitado dibujable. Es decir, puede establecer una imagen diferente para diferentes estados.

Cuando el grupo no tiene hijos, el estado correspondiente es ''state_empty''

Vea estos enlaces de referencia:

this y this

Para state_empty , puede establecer una imagen diferente que no sea confusa, o simplemente use un color transparente para mostrar nada ...

Agregue este artículo en su dibujante con estado junto con otros ....

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

Entonces, tu lista de estado puede ser así:

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

En caso de que esté utilizando una ExpandableListActivity, puede configurar el indizador de grupo en Crear de la siguiente manera:

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

He probado esto para estar trabajando.


Prueba esto >>>

para todos los artículos

getExpandableListView().setGroupIndicator(null);

En xml

android:groupIndicator="@null"


Según la respuesta de StrayPointer y el código del blog, puedes simplificar aún más el código:

En su xml, agregue lo siguiente a ExpandableListView:

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

Luego, en el adaptador, haga lo siguiente:

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

Al utilizar el método setImageResource lo haces todo con un solo trazo. No necesita las tres matrices de enteros en su adaptador. Tampoco necesita un selector XML para estado expandido y colapsado. Todo se hace a través de Java.

Además, este enfoque también muestra el indicador correcto cuando un grupo se expande de manera predeterminada, lo que no funciona con el código del blog.


Simplemente, crea un nuevo diseño xml con height = 0 para el encabezado de grupo oculto. Por ejemplo, es ''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>

Entonces el diseño de encabezado de grupo normal es ''su_grupo_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>

Finalmente, acaba de actualizar el método getGroupView en su clase de adaptador:

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 etiqueta raíz de los archivos de diseño (oculta y normal) debe ser diferente (como en el ejemplo anterior, LinearLayout y RelativeLayout)


Solo quería mejorar la respuesta de Mihir Trivedi. Puede colocar esto dentro de getGroupView () que está dentro de la clase 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]); } } }

... y en cuanto a la vista de diseño, así es como parece ser mi 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"/>

Espero que ayude ... recuerda dejar un voto positivo


Use esto, está funcionando perfectamente para mí.

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


convertView.setVisibility (View.GONE) debería hacer el truco.

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


en XML

android: groupIndicator = "@ null"

en ExpandableListAdapter -> getGroupView copy following code

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


esto podría ser otra forma de XML, establecer android:groupIndicator="@null"

Enlace de referencia: https://.com/a/5853520/2624806


te sugiero mi solución:

1) Borrar groupIndicator predeterminado:

<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) en ExpandibleAdapter:

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