Buen día, queridos lectores.
En mi artículo, quiero compartir una implementación de vista de árbol con RecyclerView. Sin usar ninguna biblioteca adicional y sin usar una matriz secundaria.
A quién le importa, por favor, debajo del gato. Trataré de describir lo más posible qué y cómo.

El principio de formar una lista de elementos es que los elementos secundarios se mostrarán u ocultarán.
Aunque dije que la implementación será sin bibliotecas adicionales, sin embargo, las bibliotecas estándar todavía necesitan estar conectadas.
Bibliotecas conectadasdependencies { implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support:design:26.1.0' implementation 'com.android.support:recyclerview-v7:26.1.0' }
El marcado será muy mínimo, solo la lista RecyclerView.
Marcado <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycler_list"> </android.support.v7.widget.RecyclerView> </RelativeLayout>
Además, necesitamos una clase separada con la que almacenaremos los valores de la lista.
Clase para datos Data.java public final class Data { private String valueText = "";
Los comentarios deben ser claros, pero lo explicaré. Para cada elemento de la lista, almacenaremos su identificador
valueId , nombre
valueText , identificador del elemento padre
parentId , una etiqueta que indica que el elemento es un elemento padre
principal y el valor de visibilidad para los elementos hijos de
childVisibility .
El siguiente paso preparatorio es crear un marcado para el elemento de la lista en sí.
Marcado para item.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/item" android:layout_width="match_parent" android:layout_height="wrap_content"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.AppCompatImageView android:id="@+id/icon_tree" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/icon_hide" android:visibility="gone" app:backgroundTint="@color/colorPrimary" android:layout_centerVertical="true"/> <LinearLayout android:id="@+id/block_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/icon_tree"> <TextView android:id="@+id/value_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:foreground="?android:attr/selectableItemBackground" android:text="sdfdsf"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/colorPrimary" android:layout_below="@+id/block_text" android:layout_marginTop="4dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp"/> </RelativeLayout> </LinearLayout>
AppCompatImageView es necesario para mostrar el estado del elemento primario.
TextView : para mostrar el valor de un elemento.
La vista es solo para compartir.
El último paso preparatorio es crear una clase para manejar el adaptador de lista.
Adaptador para la lista RecyclerViewAdapter.java public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { private View vv; private List<Data> allRecords;
El procesamiento principal tiene lugar en el procedimiento
onBindViewHolder . Para cada elemento de la lista, se obtienen su identificador, valor y parámetros del valor principal. Mostrar u ocultar elementos secundarios, así como un icono de estado para el elemento primario. Bueno, el procesamiento de clics en la lista está colgado. Luego, todos deciden cómo necesita procesar la lista. El ejemplo simplemente muestra un mensaje con id y valor de elemento.
En el procedimiento para mostrar u ocultar el
elemento secundario
setVisibility , el texto se sangra adicionalmente para el elemento secundario a 80 píxeles.
Solo queda completar la lista en el lugar correcto.
Lista de construcción List<Data> records = new ArrayList<Data>();
El resultado es una lista tan simple con soporte para elementos secundarios. Esta implementación le permite completar varios elementos anidados. Pero debe refinar ligeramente la sangría de los elementos secundarios si el nivel de anidación es superior a 1.
Gracias a todos por su atención y proyectos exitosos.