studio programacion herramientas fundamentos con avanzado aplicaciones android listview button expandablelistview expand

android - programacion - ExpandableListView ¿expandir solo en un botón específico?



manual de android en pdf (3)

bueno, estoy tratando de crear un ExpandableListView como Spotify ... Pero no tengo idea de cómo desactivar el LinearLayout para que actúe como un botón (Expandir la lista) He creado una imagen que debería describir lo que me gusta . Me gusta tener la posibilidad de manejar un clic en el texto / imagen (principal) como una interacción normal. Un clic en el botón derecho debería expandir la lista como en Spotify ...


Esta es la onCreate de ChannelList que extiende ListFragment. Almacena los datos y genera un nuevo Adaptador si se llama al Fragmento.

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { m_ListView = new ExpandableListView(getActivity()); m_ListView.setId(android.R.id.list); m_ListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); m_ListView.setMultiChoiceModeListener(m_MultiChoiceModeListener); m_ChannelListAdapter = new ChannelListAdapter(getActivity(), this); m_ListView.setAdapter(m_ChannelListAdapter); m_ListView.setGroupIndicator(null); m_ListView.setOnGroupClickListener(this); return m_ListView; }

En el Adaptador tengo el Método getGroupView que se ve así:

public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { if (view == null) { view = inflater.inflate(R.layout.layout_channelwithimage, viewGroup, false); } TextView textView = (TextView) view.findViewById(R.id.labelwithimage); textView.setText(getGroup(i).toString()); ImageButton imbu = (ImageButton) view.findViewById(R.id.imageButton); //imbu.setOnClickListener(this); imbu.setFocusable(false); return view; }

Entonces si registro ImageButton en el adaptador llamará a onClick desde el adaptador. Pero en OnClick no sé en qué grupo se hizo clic ... Si no registro el botón en ningún oyente, no se llamará a onGroupClick desde la Lista de canales ...


No es una solución demasiado elegante, pero me ayudó:

He conservado el groupIndicator original. Me gustó el comportamiento tal como era.

En el diseño groupItem, simplemente bloqueé el espacio con la vista vacía para que el groupIndicator original aún pudiera hacer clic:

<LinearLayout> .... <!--just dummy space underneath the default expand_collapse group icon - this way original expand collapse behavior is preserved on the icon--> <View android:layout_width="25dp" android:layout_height="match_parent"> </View> <!-- text view will have actionListener --> <TextView android:id="@+id/category_name" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" .... /> .... </LinearLayout>

Que se coló en el objeto callBack al crear ExpandableListAdapter y lo enganchó enHaga clic en "category_name" (para los elementos secundarios y grupales)

public class ExpandableListAdapter extends BaseExpandableListAdapter { public interface OnCategoryActionListener { boolean onCategorySelected(long categoryId); } .... public ExpandableListAdapter(Activity context, Category rootCategory, OnCategoryActionListener callBack) { this.context = context; this.rootCategory = rootCategory; this.callBack = callBack; } .... @Override public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { String categoryName = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.category, null); } TextView item = (TextView) convertView.findViewById(R.id.category_name); item.setTypeface(null, Typeface.BOLD); item.setText(categoryName); item.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { callBack.onCategorySelected(getGroupId(groupPosition)); } }); .....

Todo lo que tienes que hacer ahora es inicializar correctamente ExpandableListAdapter en la clase de fragmento maestro

expListAdapter = new ExpandableListAdapter(getActivity(), this.rootCategory, new OnCategoryActionListener()); expListView = (ExpandableListView) getActivity().findViewById(R.id.categories_list); expListView.setAdapter(expListAdapter);


Esta es una pregunta un poco vieja, pero esta respuesta podría ayudar a alguien.

Si desea expandir / colapsar el grupo haciendo clic en un Button específico o en alguna otra View , debe obtener ese Botón en el método getGroupView en su clase de Adaptador. Luego, en el método onClick de su Button , tiene que lanzar el elemento parent a ExpandableListView o pasar la referencia de la lista en el constructor cuando crea el adaptador.

Prefiero el primer acercamiento. Aquí está el código, suponiendo que tiene un TextView y un ImageView que es la flecha. He agregado cambiar el estado de la flecha también.

@Override public View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, final ViewGroup parent) { String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.left_drawer_list_group, parent, false); } TextView listHeaderText = (TextView) convertView .findViewById(R.id.left_menu_list_header_text); ImageView listHeaderArrow = (ImageView) convertView.findViewById(R.id.left_menu_list_header_arrow); listHeaderText.setText(headerTitle); //Set the arrow programatically, so we can control it int imageResourceId = isExpanded ? android.R.drawable.arrow_up_float : android.R.drawable.arrow_down_float; listHeaderArrow.setImageResource(imageResourceId); listHeaderArrow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(isExpanded) ((ExpandableListView) parent).collapseGroup(groupPosition); else ((ExpandableListView) parent).expandGroup(groupPosition, true); } }); return convertView; }

Además, desea deshabilitar la expansión / onGroupClick en el oyente onGroupClick .

@Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { //Do some other stuff, but you shall not expand or collapse return true; }

Existe otro método, pero bastante malo, y es que copia toda la clase de Adapter dentro de la clase donde crea ExpandableListView y configura Adapter . Pero no hagas eso. ¡Seriamente! ;)