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

Diseño de materiales Expand / Collapse List

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 } 
  • Botón "Cerrar" de material en la barra de herramientas en lugar de Volver
  • Android Lollipop Diseño del material Desbordamiento Menú Icon color
  • Botón de inicio de Android en la barra de herramientas de contracción con imagen
  • Agregar botón como "Nuevo correo" de la aplicación de Gmail
  • Android 5: botón debajo de la barra de softnavigation (herencia de Showcaseview)
  • Espacio flexible en Android
  • Android "más suave" ocultación de la barra de herramientas al desplazarse
  • ¿Qué tamaño deben tener los iconos de Barra de Acción (Barra de herramientas) en el nuevo diseño de Material Android?
  • Cómo animar FloatingActionButton como en la aplicación de Google+ para Android?
  • Dimensión de imagen de fondo para la cabecera del cajón de navegación
  • Espacio en blanco debajo de CoordinatorLayout en DrawerLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.