¿Cómo puedo implementar una Lista de Expandir / Contraer el Material de Diseño en Android?
Estoy buscando para implementar una lista de material de este estilo. ¿Cómo puedo hacerlo en Android? ¿Qué clases debo mirar? ¿Existen bibliotecas existentes que podrían facilitar la implementación?
- Cambiar diseño de material AppCompat ActionBar Color
- Forma de diseño de material para Android
- Estilo de la barra de herramientas de Android Spinner
- La expansión CollapsingToolbarLayout no funciona con RecyclerView
- Barra de herramientas dentro de CardView para crear un menú emergente (icono de desbordamiento)
- Diseño de material Android: eliminar animación de sugerencias
- Cómo utilizar TabLayout con la barra de herramientas dentro de CollapsingToolbarLayout?
- Cómo iniciar la aplicación con Theme.Material en dispositivos antiguos
- Cuadro de selección alrededor de android.support.v7.widget.SwitchCompat
- Uso de Theme.Material.Light.DarkActionBar con Theme.AppCompat.Light.DarkActionBar bloquea la aplicación en android L (api v21)
- Transiciones de la actividad de Android con la ayuda v4 actualizada con Android L
- Cómo mostrar los elementos colapsados en CoordinatorLayout mediante programación?
- Cómo utilizar la nueva API de las preferencias, presentada en la nueva biblioteca de soporte 23
Sí, puedes implementarlo fácilmente con la biblioteca SectionedRecyclerViewAdapter . Aquí hay un ejemplo completo de trabajo.
Básicamente, se crea una clase de sección:
class MySection extends StatelessSection { String title; List<String> list; boolean expanded = true; // true if you want it to be displayed expanded initially public MySection(String title, List<String> list) { // call constructor with layout resources for this Section header, footer and items super(R.layout.section_header, R.layout.section_item); this.title = title; this.list = list; } @Override public int getContentItemsTotal() { return expanded? list.size() : 0; } @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)); } @Override public RecyclerView.ViewHolder getHeaderViewHolder(View view) { return new SimpleHeaderViewHolder(view); } @Override public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder; // bind your header view here headerHolder.tvItem.setText(title); // handles the click on the header to toggle the expanded variable 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(); } }); } }
A continuación, configure el RecyclerView con sus secciones:
// Create an instance of SectionedRecyclerViewAdapter SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter(); // Create your sections with the list of data for each topic MySection topic1Section = new MySection("Attractions", attractionsList); MySection topic2Section = new MySection("Dining", diningList); // Add your Sections to the adapter sectionAdapter.addSection(topic1Section); sectionAdapter.addSection(topic2Section); // Set up your RecyclerView with the SectionedRecyclerViewAdapter RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(sectionAdapter);
Implementé una lista con esta biblioteca:
Ampliación-reciclado-vista
Hay un blog relacionado, pero se refiere a una versión antigua:
Expanda un RecyclerView en cuatro pasos
Es básicamente un adaptador donde se puede suministrar una lista de elementos padre que contienen a los niños. También tiene que especificar dos titulares para los padres y los niños. Vea la página de la biblioteca para más detalles.
class MyChild { // add data } class MyParentListItem implements ParentListItem { private final List<MyChild> mChildren; MyParentListItem(List<MyChild> children) { mChildren = children; // add other data } @Override public List<MyChild> getChildItemList() { return mChildren; } @Override public boolean isInitiallyExpanded() { return false; } } class MyParentViewHolder extends ParentViewHolder { MyParentViewHolder(View itemView) { super(itemView); // get other views with itemView.findViewById(..); } } class MyChildViewHolder extends ChildViewHolder { MyParentViewHolder(View itemView) { super(itemView); // get other views with itemView.findViewById(..); } } public class MyExpandableAdapter extends ExpandableRecyclerAdapter<MyParentViewHolder, MyChildViewHolder> { private final LayoutInflater mInflater; public MyExpandableAdapter(List<MyParentListItem> parentItemList, Context context) { super(parentItemList); mInflater = LayoutInflater.from(context); } @Override public MyParentViewHolder onCreateParentViewHolder(ViewGroup parentViewGroup) { final View itemView = mInflater.inflate(R.layout.parent_layout, parentViewGroup, false); return new MyParentViewHolder(itemView); } @Override public MyChildViewHolder onCreateChildViewHolder(ViewGroup childViewGroup) { final View itemView = mInflater.inflate(R.layout.child_layout, childViewGroup, false); return new MyChildViewHolder(itemView); } // bind data to holders in the onBind methods }
- ¿Cómo puedo cambiar el fondo de los cuadros de diálogo de alerta de Android?
- API de Android Places: Servicios de Google Play desactualizados en el emulador