Cómo implementar elementos expandibles con LinearLayoutManager (introducido con Android L)
RecyclerView
ha sido introducido con Android L y forma parte de la biblioteca AppCompat v7. Entonces decidí actualizar mi aplicación con este nuevo RecyclerView
para reemplazar mi ListView
. Para ello, cuando se trata de establecer un LayoutManager
para el RecyclerView
, estoy usando el LinearLayoutManager
, que funciona bien.
Aquí está lo difícil: cuando quiero cambiar mi ExpandableListView
a un RecyclerView
. Dado que Google no ha creado un " ExpandableLayoutManager
", esto es bastante complicado y no puedo lograrlo.
- RecyclerView altura del contenido
- NotifyItemChanged () hace que el RecyclerView desplace y salte a UP
- Eliminar elementos de RecyclerView
- Adaptador RecyclerView que toma valores erróneos
- Sugerencias de diseño de material para listas con avatar, texto e icono
La documentación menciona a los niños, pero parece ser que los niños de la visión de la raíz de la RecyclerView
no de los propios niños.
¿Tiene alguien una solución o algunas pistas sobre él? O al menos alguna información como por dónde empezar para poder implementar mi propio LayoutManager
.
Gracias,
- El cambio de color de un solo dibujable en RecyclerView cambiará todos los dibujables
- Vista del reciclador que muestra un solo elemento
- Recycler View Excepción grave: java.lang.ArrayIndexOutOfBoundsException
- ¿Por qué RecyclerView onBindViewHolder se llama una sola vez?
- Cómo implementar load más recyclerview en android
- Activar la vista del reciclador
- Diferentes elementos (dinámicos) de altura en GridLayoutManager
Esta biblioteca le ayuda a agrupar sus elementos en "secciones" y, a continuación, puede implementar la funcionalidad de expansión / contracción que sigue en este ejemplo .
Primero crea su clase de sección:
class MySection extends StatelessSection { String header; List<String> list; boolean expanded = true; public MySection(String header, List<String> list) { // call constructor with layout resources for this Section header and items super(R.layout.section_header, R.layout.section_item); this.myHeader = header; this.myList = list; } @Override public int getContentItemsTotal() { return expanded? list.size() : 0; } @Override public RecyclerView.ViewHolder getHeaderViewHolder(View view) { return new HeaderViewHolder(view); } @Override public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { final HeaderViewHolder headerHolder = (HeaderViewHolder) holder; headerHolder.tvTitle.setText(title); headerHolder.rootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { expanded = !expanded; headerHolder.imgArrow.setImageResource( expanded ? R.drawable.ic_keyboard_arrow_up_black_18dp : R.drawable.ic_keyboard_arrow_down_black_18dp ); sectionAdapter.notifyDataSetChanged(); } }); } @Override public RecyclerView.ViewHolder getItemViewHolder(View view) { // return a custom instance of ViewHolder for the items of this section return new MyItemViewHolder(view); } @Override public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) { MyItemViewHolder itemHolder = (MyItemViewHolder) holder; // bind your view here itemHolder.tvItem.setText(list.get(position)); } }
A continuación, cree la instancia de sus secciones y configure su adaptador:
// Create an instance of SectionedRecyclerViewAdapter SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter(); // Add your Sections sectionAdapter.addSection(new MySection("Section 1", Arrays.asList(new String[] {"Item 1", "Item 2", "Item 3", "Item 4" }))); sectionAdapter.addSection(new MySection("Section 2", Arrays.asList(new String[] {"Item 1", "Item 2" }))); // Set up your RecyclerView with the SectionedRecyclerViewAdapter RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(sectionAdapter);