¿Cómo acceder a cualquier componente fuera de RecyclerView desde RecyclerView en Android?

El título puede ser un poco confuso, pero lo que queremos decir es, supongamos que en una aplicación de Android hay un RecyclerView y fuera de eso hay un TextView . En RecyclerView hay una lista de componentes en los que se puede hacer clic, dijo Button . Ahora lo que quiero es, para diferentes clics de botón, el texto en TextView será diferente. Básicamente, esto es controlar un componente fuera de RecyclerView, desde un RecyclerView.

Según la imagen, hay un RecyclerView con cuatro botones (1 oculto a la izquierda) y un TextView. Para diferentes clics de botón, se muestran diferentes textos en TextView. En este artículo, se implementará el mismo concepto con un pequeño toque del mundo real. Entonces, la aplicación final mostrará una lista y una sublista de los tutoriales ofrecidos por GEEKS FOR GEEKS . Aquí hay un GIF de demostración de la aplicación final:

requisitos previos:

Paso 1: trabajar con el archivo activity_main.xml

  • Vaya al archivo res -> diseño -> actividad_principal.xml .
  • Aquí está el código de ese archivo XML:

XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
  
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:orientation="vertical"
        android:padding="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
  
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center">
  
            <TextView
                style="@style/MaterialAlertDialog.MaterialComponents.Title.Icon"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="GEEKS FOR GEEKS TUTORIALS"
                android:textAlignment="center"
                android:textSize="25sp"
                android:textStyle="bold" />
  
  
        </LinearLayout>
  
        <!-- The horizontal recyclerView where the 
             Main-List items will be showed -->
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerViewOne"
            android:layout_width="match_parent"
            android:layout_height="150dp"
            android:layout_marginTop="20dp"
            android:clipToPadding="false"
            android:foregroundGravity="center"
            android:orientation="horizontal" />
  
        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="20dp"
            android:gravity="center">
  
            <!-- The TextView where the Main-List item 
                 title text will be showed -->
            <TextView
                android:id="@+id/algorithmTitleText"
                style="@style/ShapeAppearance.MaterialComponents.MediumComponent"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@android:color/black"
                android:textSize="22sp" />
  
        </LinearLayout>
  
        <!-- The vertical recyclerView where the Sub-List 
             items will be showed -->
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerViewTwo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="20dp"
            android:clipToPadding="false"
            android:foregroundGravity="center" />
  
    </LinearLayout>
  
</androidx.constraintlayout.widget.ConstraintLayout>
  • Aquí se utilizan dos RecyclerView , uno horizontal ( recyclerViewOne ) y otro vertical ( recyclerViewTwo ). El primero muestra la lista principal y el segundo muestra la sublista del elemento de la lista principal.
  • También se usa un TextView para mostrar el texto principal del elemento de la lista.

Paso 2: agregue single_card_layout.xml para los elementos de la lista principal

  • Ir a la res -> diseño
  • Haga clic derecho en la carpeta de diseño
  • Vaya a Nuevo -> Archivo de recursos de diseño
  • Escriba el nombre del archivo ( single_card_layout.xml para mí)
  • Cambie el elemento raíz a RelativeLayout
  • Haga clic en Aceptar

  • Aquí está el código de este archivo XML:

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
  
    <androidx.cardview.widget.CardView
        android:id="@+id/singleItemCardView"
        android:layout_width="145dp"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:elevation="10dp"
        app:cardCornerRadius="30dp"
        android:clickable="true"
        android:focusable="true"
        android:foreground="?android:attr/selectableItemBackground">
  
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:layout_gravity="center">
  
            <TextView
                android:id="@+id/singleItemTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingStart="10dp"
                android:paddingEnd="10dp"
                android:text="TEST TEXT"
                android:gravity="center"
                android:textAlignment="center"
                android:textColor="@android:color/black"
                android:textSize="15sp"
                android:textAllCaps="true"
                android:letterSpacing="0.2" />
  
        </RelativeLayout>
    </androidx.cardview.widget.CardView>
</RelativeLayout>
  • Este es básicamente el diseño de los elementos que se muestran en el recyclerViewOne o la lista principal o el RecyclerView horizontal.

Paso 3: agregue single_card_layout_vertical.xml para los elementos de la sublista

  • Ir a la res -> diseño
  • Haga clic derecho en la carpeta de diseño
  • Vaya a Nuevo -> Archivo de recursos de diseño
  • Escriba el nombre del archivo ( single_card_layout_vertical.xml según este ejemplo)
  • Cambie el elemento raíz a RelativeLayout
  • Haga clic en Aceptar
  • Aquí está el código de este archivo XML:

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center">
  
    <androidx.cardview.widget.CardView
        android:id="@+id/singleItemCardView"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_margin="10dp"
        android:clickable="true"
        android:elevation="10dp"
        android:focusable="true"
        android:foreground="?android:attr/selectableItemBackground"
        app:cardCornerRadius="5dp">
  
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:gravity="center_vertical"
            android:padding="5dp">
  
            <TextView
                android:id="@+id/singleItemTextViewRVTwo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:letterSpacing="0.2"
                android:paddingStart="10dp"
                android:paddingEnd="10dp"
                android:text="TEST TEXT"
                android:textAlignment="inherit"
                android:textAllCaps="true"
                android:textColor="@android:color/black"
                android:textSize="15sp" />
  
        </RelativeLayout>
  
    </androidx.cardview.widget.CardView>
</RelativeLayout>
  • Este es el diseño de los elementos que se muestran en RecyclerViewTwo, en la sublista o en RecyclerView vertical.

Paso 4: trabajar en el RecyclerView horizontal o en la lista principal

  • Vaya a java ->com.wheic.recyclergetsout (el suyo puede diferir)
  • Cree un directorio en com.wheic.recyclergetsout (lo llamé RV1). Crear un directorio desde Android Studio es extraño, hay muchos errores en el proceso (al menos para mí). Así que puedes seguir estos pasos:

  • Haga clic derecho en com.wheic.recyclergetsout (el suyo puede diferir)
  • com.wheic.recyclergetsout -> Nuevo -> Directorio de datos de muestra

  • Vaya a Construir -> Reconstruir proyecto

  • Se verá una carpeta de datos de muestra debajo de la carpeta de la aplicación.

  • Haz clic derecho sobre él. Vaya a Refactorizar -> Cambiar nombre .

  • Dar el nombre de la carpeta. (Aquí lo llamamos RV1).
  • Haga clic en Refactorizar .

  • Arrastra la carpeta a com.wheic.recyclergetsout
  • Haga clic en Refactorizar en la ventana emergente.

  • Vaya a Construir -> Reconstruir proyecto .
  • O , si no quiere hacer todo esto, simplemente vaya directamente al Explorador y cree un directorio allí. Para esto, haga clic con el botón derecho en com.wheic.recyclergetsout -> Show in Explorer . Luego cree una carpeta allí manualmente.

Comience a trabajar en la clase de modelo correspondiente:

  1. Haga clic derecho en la carpeta recién creada (RV1) -> Nuevo -> Clase Java . Dar el nombre de la clase. Lo llamé RVOneModel .
  2. Básicamente, estoy usando dos variables, un tipo de string y un número entero. La variable String se utilizará para almacenar el título del elemento de la lista y la variable entera para diferenciar cada elemento. Luego, se crea un constructor con ambas variables y solo las funciones Getter para estas dos variables.
  3. Aquí está el código java de la clase modelo:

Java

public class RVOneModel {
       // this variable will store main-list item title
    private String name;
         
      // this will differentiate between the main-list items
    private int num;
  
    // parameterized constructor
    public RVOneModel(String name, int num) {
        this.name = name;
        this.num = num;
    }
  
    // getter functions for these two variables
    public String getName() {
        return name;
    }
  
    public int getNum() {
        return num;
    }
}

Comience a trabajar en la clase Adapter para el RecyclerView horizontal:

  1. Entonces, haga clic con el botón derecho en la carpeta recién creada (RV1) -> Nuevo -> Clase Java . Dar el nombre de la clase. Lo llamé RVOneAdapter .
  2. Entonces, con el adaptador, también necesitamos una clase ViewHolder .
  3. El uso de estas clases y cualquier otro método ya se describen claramente en este enlace GFG.
  4. Aquí está el código java de esta clase Adapter con la clase ViewHolder:

Java

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import com.wheic.recyclergetsout.R;
import java.util.List;
  
public class RVOneAdapter extends RecyclerView.Adapter<RVOneAdapter.ViewHolder> {
  
    // Main-list item titles will be stored here
      private List<RVOneModel> tutorialList; 
    
    // Parameterized constructor of this 
      // class to initialize tutorialList
    public RVOneAdapter(List<RVOneModel> tutorialList) {
        this.tutorialList = tutorialList;
  
    }
  
    // Attach the item layout with the proper xml file
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_card_layout, parent, false);
        return new ViewHolder(view);
    }
  
    // It deals with the setting of different data and methods
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final RVOneModel modelItems = tutorialList.get(position);
        holder.setData(tutorialList.get(position).getName());
    }
  
    // It returns the length of the RecyclerView
    @Override
    public int getItemCount() {
        return tutorialList.size();
    }
  
    // The ViewHolder is a java class that stores 
      // the reference to the item layout views
    public class ViewHolder extends RecyclerView.ViewHolder{
  
        public CardView singleItemCardView;
        public TextView singleItemTextView;
  
        //Link up the Main-List items layout 
          // components with their respective id
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            singleItemCardView = itemView.findViewById(R.id.singleItemCardView);
            singleItemTextView = itemView.findViewById(R.id.singleItemTextView);
        }
  
        // setText in Main-List title text
        public void setData(String name){
            this.singleItemTextView.setText(name);
        }
    }
}

Comience a trabajar en MainActivity.java para agregar el primer RecyclerView:

  1. TutorialList se almacena con variables de string de título de elementos de la lista principal una por una y luego el adaptador se establece en RecyclerView horizontal.
  2. Aquí está el código en MainActivity.java para agregar el primer RecyclerView:

Java

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.wheic.recyclergetsout.RV1.RVOneAdapter;
import com.wheic.recyclergetsout.RV1.RVOneModel;
import java.util.ArrayList;
import java.util.List;
  
public class MainActivity extends AppCompatActivity {
  
      // reference for the Main-List RecyclerView
    private RecyclerView RVOne; 
      // Main-list item titles will be stored here
    private List<RVOneModel> tutorialList; 
      // reference for the RVOneAdapter class
    private RVOneAdapter rvOneAdapter; 
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // Linked up with its respective id 
          // used in the activity_main.xml
        RVOne = findViewById(R.id.recyclerViewOne);
        RVTwo = findViewById(R.id.recyclerViewTwo);
  
        // Setting the Main-List RecyclerView horizontally
        RVOne.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false));
  
        tutorialList = new ArrayList<>();
  
        // Static data are stored one by one in the tutorialList arrayList
        tutorialList.add(new RVOneModel("Algorithms", 1));
        tutorialList.add(new RVOneModel("Data Structures", 2));
        tutorialList.add(new RVOneModel("Languages", 3));
        tutorialList.add(new RVOneModel("Interview Corner", 4));
        tutorialList.add(new RVOneModel("GATE", 5));
        tutorialList.add(new RVOneModel("ISRO CS", 6));
        tutorialList.add(new RVOneModel("UGC NET CS", 7));
        tutorialList.add(new RVOneModel("CS Subjects", 8));
        tutorialList.add(new RVOneModel("Web Technologies", 9));
  
        rvOneAdapter = new RVOneAdapter(tutorialList);
        RVOne.setAdapter(rvOneAdapter);
    }
}

 

Paso 5: configure el clickListener para cada elemento en el RecyclerView horizontal:

  • Los siguientes 4 pasos se realizan en RVOneAdapater.java
  • Primero, se crea una interfaz en RVOneAdapater.java para cada clic de elemento con un método abstracto onItemClick .

Java

// Interface to perform events on Main-List item click
public interface OnItemsClickListener{
    void onItemClick(RVOneModel rvOneModel);
}
  • Se crea una variable de referencia de la interfaz.

Java

// Need this for the Main-list item onClick events
private OnItemsClickListener listener;
  • Se crea un método setWhenClickListener que se llamará desde MainActivity.

Java

// Main-list item clickListener is initialized
// This will be used in MainActivity
public void setWhenClickListener(OnItemsClickListener listener){
    this.listener = listener;
}
  • Ahora, dentro de onBindViewHolder, se crea un setOnClickListener que en realidad llamará al método onItemClick cuando se haga clic en un solo elemento en el RecyclerView horizontal.

Java

holder.singleItemCardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(listener != null){
            listener.onItemClick(modelItems);
        }
    }
});
  • En MainActivity.java, se crea una variable de referencia para TextView y se adjunta con el archivo XML usando la identificación correspondiente.

Java

algorithmTitleText = findViewById(R.id.algorithmTitleText);
  • Ahora, se llama al adaptador setOnClickListener y el evento de cambio de texto textView ocurrirá cuando se haga clic en un solo elemento de la lista.

Java

rvOneAdapter.setWhenClickListener(new RVOneAdapter.OnItemsClickListener() {
    @Override
    public void onItemClick(RVOneModel rvOneModel) {
        algorithmTitleText.setText(rvOneModel.getName());
        setRVTwoList(rvOneModel.getNum());
    }
});

Paso 6: Trabaje en el RecyclerView vertical o en la sublista

  • Vaya a java -> com.wheic.recyclergetsout (el suyo puede diferir)
  • Al igual que el anterior, se hace un directorio. Lo llamé RV2.

Comience a trabajar en la clase modelo para la sublista:

  1. Haga clic derecho en la carpeta recién creada (RV2) -> Nuevo -> Clase Java . Dar el nombre de la clase. para mí es RVTwoModel .
  2. Según esta aplicación, en esta clase de modelo, solo se necesita una variable de string. La variable String almacenará el texto del título del elemento de la sublista. Luego, al igual que el anterior, se crean un constructor y una función getter.
  3. Aquí está el código java de la clase modelo.

Java

public class RVTwoModel {
      // this variable will store sub-list item title
    private String name; 
  
    // parameterized constructor
    public RVTwoModel(String name) {
        this.name = name;
    }
  
    // getter function for the name variable
    public String getName() {
        return name;
    }
}

Comience a trabajar en la clase Adapter para el RecyclerView vertical:

  1. Haga clic derecho en la carpeta recién creada (RV2) -> Nuevo -> Clase Java . Dar el nombre de la clase. Lo llamé RVTwoAdapter .
  2. Al igual que cualquier otro RecyclerView, esta clase de adaptador tampoco es tan diferente.
  3. Aquí está el código Java de esta clase Adapter y la clase ViewHolder:

Java

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.wheic.recyclergetsout.R;
import java.util.List;
  
public class RVTwoAdapter extends RecyclerView.Adapter<RVTwoAdapter.ViewHolder> {
  
       // Sub-list item titles will be stored here
    private List<RVTwoModel> tutorialSubList;
  
    // Parameterized constructor of this class 
      // to initialize tutorialSubList
    public RVTwoAdapter(List<RVTwoModel> tutorialSubList) {
        this.tutorialSubList = tutorialSubList;
    }
  
    // Attach the item layout with the proper xml file
    @NonNull
    @Override
    public RVTwoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_card_layout_vertical, parent, false);
        return new ViewHolder(view);
    }
  
    // It deals with the setting of different data and methods
    @Override
    public void onBindViewHolder(@NonNull RVTwoAdapter.ViewHolder holder, int position) {
        holder.setData(tutorialSubList.get(position).getName());
    }
  
    // It returns the length of the RecyclerView
    @Override
    public int getItemCount() {
        return tutorialSubList.size();
    }
  
    // The ViewHolder is a java class that stores 
      // the reference to the item layout views
    public class ViewHolder extends RecyclerView.ViewHolder{
  
        public TextView rvTwoText;
  
        // Link up the Sub-List items layout 
          // components with their respective id
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            rvTwoText = itemView.findViewById(R.id.singleItemTextViewRVTwo);
        }
  
        // setText in Sub-List title text
        public void setData(String name){
            this.rvTwoText.setText(name);
        }
    }
}

Terminemos el código en MainActivity.java:

  1. Se necesita un segundo tutorial de ArrayListSubList para la sublista. Entonces se crea una variable de referencia de un segundo ArrayList.

Java

// Sub-list item titles will be stored here
private List<RVTwoModel> tutorialSubList;
  1. Se crea una función solo para el recyclerView vertical, que toma un parámetro entero.
  2. Los datos estáticos se agregan en ArrayList para cada elemento de la lista principal.

Aquí está el código para la función:

Java

private void setRVTwoList(int num){
  
    // Setting the Sub-List RecyclerView vertically
    RVTwo.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
  
    // Previous tutorialSubList will be deleted 
      // and new memory will be allocated
    tutorialSubList = new ArrayList<>();
  
    // Static data are stored one by one in the
      // tutorialSubList arrayList for each Main-List items
    if (num == 1) {
  
        tutorialSubList.add(new RVTwoModel("Searching Algorithms"));
        tutorialSubList.add(new RVTwoModel("Sorting Algorithms"));
        tutorialSubList.add(new RVTwoModel("Graph Algorithms"));
        tutorialSubList.add(new RVTwoModel("Pattern Algorithms"));
        tutorialSubList.add(new RVTwoModel("Geometric Algorithms"));
        tutorialSubList.add(new RVTwoModel("Mathematical"));
        tutorialSubList.add(new RVTwoModel("Randomized Algorithms"));
        tutorialSubList.add(new RVTwoModel("Greedy Algorithms"));
        tutorialSubList.add(new RVTwoModel("Dynamic Programming"));
        tutorialSubList.add(new RVTwoModel("Divide and Conquer"));
        tutorialSubList.add(new RVTwoModel("Backtracking"));
        tutorialSubList.add(new RVTwoModel("Branch and Bound"));
        tutorialSubList.add(new RVTwoModel("All Algorithms"));
  
    } else if (num == 2){
  
        tutorialSubList.add(new RVTwoModel("Arrays"));
        tutorialSubList.add(new RVTwoModel("Linked List"));
        tutorialSubList.add(new RVTwoModel("Stack"));
        tutorialSubList.add(new RVTwoModel("Queue"));
        tutorialSubList.add(new RVTwoModel("Binary Tree"));
        tutorialSubList.add(new RVTwoModel("Binary Search Tree"));
        tutorialSubList.add(new RVTwoModel("Heap"));
        tutorialSubList.add(new RVTwoModel("Hashing"));
        tutorialSubList.add(new RVTwoModel("Graph"));
        tutorialSubList.add(new RVTwoModel("Advanced Data Structure"));
        tutorialSubList.add(new RVTwoModel("Matrix"));
        tutorialSubList.add(new RVTwoModel("Strings"));
        tutorialSubList.add(new RVTwoModel("All Data Structures"));
  
    } else if (num == 3){
  
        tutorialSubList.add(new RVTwoModel("C"));
        tutorialSubList.add(new RVTwoModel("C++"));
        tutorialSubList.add(new RVTwoModel("Java"));
        tutorialSubList.add(new RVTwoModel("Python"));
        tutorialSubList.add(new RVTwoModel("C#"));
        tutorialSubList.add(new RVTwoModel("Javascript"));
        tutorialSubList.add(new RVTwoModel("JQuery"));
        tutorialSubList.add(new RVTwoModel("SQL"));
        tutorialSubList.add(new RVTwoModel("PHP"));
        tutorialSubList.add(new RVTwoModel("Scala"));
        tutorialSubList.add(new RVTwoModel("Perl"));
        tutorialSubList.add(new RVTwoModel("GO Language"));
        tutorialSubList.add(new RVTwoModel("HTML"));
        tutorialSubList.add(new RVTwoModel("CSS"));
        tutorialSubList.add(new RVTwoModel("Kotlin"));
  
    } else if (num == 4){
  
        tutorialSubList.add(new RVTwoModel("Company Preparation"));
        tutorialSubList.add(new RVTwoModel("Top Topics"));
        tutorialSubList.add(new RVTwoModel("Practice Company Questions"));
        tutorialSubList.add(new RVTwoModel("Interview Experiences"));
        tutorialSubList.add(new RVTwoModel("Experienced Interviews"));
        tutorialSubList.add(new RVTwoModel("Internship Interviews"));
        tutorialSubList.add(new RVTwoModel("Competitive Programming"));
        tutorialSubList.add(new RVTwoModel("Design Patterns"));
        tutorialSubList.add(new RVTwoModel("Multiple Choice Quizzes"));
  
    } else if (num == 5){
  
        tutorialSubList.add(new RVTwoModel("GATE CS Notes 2021"));
        tutorialSubList.add(new RVTwoModel("Last Minute Notes"));
        tutorialSubList.add(new RVTwoModel("GATE CS Solved Papers"));
        tutorialSubList.add(new RVTwoModel("GATE CS Original Papers and Official Keys"));
        tutorialSubList.add(new RVTwoModel("GATE 2021 Dates"));
        tutorialSubList.add(new RVTwoModel("GATE CS 2021 Syllabus"));
        tutorialSubList.add(new RVTwoModel("Important Topics for GATE CS"));
        tutorialSubList.add(new RVTwoModel("Sudo GATE 2021"));
  
    } else if (num == 6){
  
        tutorialSubList.add(new RVTwoModel("ISRO CS Solved Papers"));
        tutorialSubList.add(new RVTwoModel("ISRO CS Original Papers and Official Keys"));
        tutorialSubList.add(new RVTwoModel("ISRO CS Syllabus for Scientist/Engineer Exam"));
  
    } else if (num == 7){
        tutorialSubList.add(new RVTwoModel("UGC NET CS Notes Paper II"));
        tutorialSubList.add(new RVTwoModel("UGC NET CS Notes Paper III"));
        tutorialSubList.add(new RVTwoModel("UGC NET CS Solved Papers"));
  
    } else if (num == 8){
  
        tutorialSubList.add(new RVTwoModel("Mathematics"));
        tutorialSubList.add(new RVTwoModel("Operating System"));
        tutorialSubList.add(new RVTwoModel("DBMS"));
        tutorialSubList.add(new RVTwoModel("Computer Networks"));
        tutorialSubList.add(new RVTwoModel("Computer Organization and Architecture"));
        tutorialSubList.add(new RVTwoModel("Theory of Computation"));
        tutorialSubList.add(new RVTwoModel("Compiler Design"));
        tutorialSubList.add(new RVTwoModel("Digital Logic"));
        tutorialSubList.add(new RVTwoModel("Software Engineering"));
  
    } else if (num == 9){
  
        tutorialSubList.add(new RVTwoModel("HTML"));
        tutorialSubList.add(new RVTwoModel("CSS"));
        tutorialSubList.add(new RVTwoModel("Javascript"));
        tutorialSubList.add(new RVTwoModel("jQuery"));
        tutorialSubList.add(new RVTwoModel("PHP"));
  
    }
  
    rvTwoAdapter = new RVTwoAdapter(tutorialSubList);
    RVTwo.setAdapter(rvTwoAdapter);
}
  • Dentro de onCreate() , la función setRVTwo() se llama en el elemento de la lista principal clickListener. Además, se llama afuera porque necesitamos ver la sublista justo cuando se crea la actividad.

Java

// The app will show Algorithms Sub-List
// every time the activity starts
algorithmTitleText.setText("Algorithms");
setRVTwoList(1);

 

Aquí están todos los códigos JAVA finales de este proyecto:

MainActivity.java

Java

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.wheic.recyclergetsout.RV1.RVOneAdapter;
import com.wheic.recyclergetsout.RV1.RVOneModel;
import com.wheic.recyclergetsout.RV2.RVTwoAdapter;
import com.wheic.recyclergetsout.RV2.RVTwoModel;
import java.util.ArrayList;
import java.util.List;
  
public class MainActivity extends AppCompatActivity {
    
      // reference for the Main-List RecyclerView
    private RecyclerView RVOne; 
      // reference for the Sub-List RecyclerView
    private RecyclerView RVTwo; 
      // Main-list item titles will be stored here
    private List<RVOneModel> tutorialList; 
      // Sub-list item titles will be stored here
    private List<RVTwoModel> tutorialSubList; 
      // reference for the RVOneAdapter class
    private RVOneAdapter rvOneAdapter; 
      // reference for the RVTwoAdapter class
    private RVTwoAdapter rvTwoAdapter; 
      // TextView to show the title of the clicked Main-List item
    private TextView algorithmTitleText; 
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // Linked up with its respective id used in the activity_main.xml
        RVOne = findViewById(R.id.recyclerViewOne);
        RVTwo = findViewById(R.id.recyclerViewTwo);
        algorithmTitleText = findViewById(R.id.algorithmTitleText);
  
        // Setting the Main-List RecyclerView horizontally
        RVOne.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false));
  
        tutorialList = new ArrayList<>();
  
        // Static data are stored one by one in the tutorialList arrayList
        tutorialList.add(new RVOneModel("Algorithms", 1));
        tutorialList.add(new RVOneModel("Data Structures", 2));
        tutorialList.add(new RVOneModel("Languages", 3));
        tutorialList.add(new RVOneModel("Interview Corner", 4));
        tutorialList.add(new RVOneModel("GATE", 5));
        tutorialList.add(new RVOneModel("ISRO CS", 6));
        tutorialList.add(new RVOneModel("UGC NET CS", 7));
        tutorialList.add(new RVOneModel("CS Subjects", 8));
        tutorialList.add(new RVOneModel("Web Technologies", 9));
  
        // The app will show Algorithms Sub-List every time the activity starts
        algorithmTitleText.setText("Algorithms");
        setRVTwoList(1);
  
        rvOneAdapter = new RVOneAdapter(tutorialList);
        RVOne.setAdapter(rvOneAdapter);
  
        // Setting up the events that will occur on each Main-List item click
        rvOneAdapter.setWhenClickListener(new RVOneAdapter.OnItemsClickListener() {
            @Override
            public void onItemClick(RVOneModel rvOneModel) {
                algorithmTitleText.setText(rvOneModel.getName());
                setRVTwoList(rvOneModel.getNum());
            }
        });
  
    }
  
    private void setRVTwoList(int num){
  
        // Setting the Sub-List RecyclerView vertically
        RVTwo.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
  
        // Previous tutorialSubList will be deleted and new memory will be allocated
        tutorialSubList = new ArrayList<>();
  
        // Static data are stored one by one in the tutorialSubList arrayList for each Main-List items
        if (num == 1) {
  
            tutorialSubList.add(new RVTwoModel("Searching Algorithms"));
            tutorialSubList.add(new RVTwoModel("Sorting Algorithms"));
            tutorialSubList.add(new RVTwoModel("Graph Algorithms"));
            tutorialSubList.add(new RVTwoModel("Pattern Algorithms"));
            tutorialSubList.add(new RVTwoModel("Geometric Algorithms"));
            tutorialSubList.add(new RVTwoModel("Mathematical"));
            tutorialSubList.add(new RVTwoModel("Randomized Algorithms"));
            tutorialSubList.add(new RVTwoModel("Greedy Algorithms"));
            tutorialSubList.add(new RVTwoModel("Dynamic Programming"));
            tutorialSubList.add(new RVTwoModel("Divide and Conquer"));
            tutorialSubList.add(new RVTwoModel("Backtracking"));
            tutorialSubList.add(new RVTwoModel("Branch and Bound"));
            tutorialSubList.add(new RVTwoModel("All Algorithms"));
  
        } else if (num == 2){
  
            tutorialSubList.add(new RVTwoModel("Arrays"));
            tutorialSubList.add(new RVTwoModel("Linked List"));
            tutorialSubList.add(new RVTwoModel("Stack"));
            tutorialSubList.add(new RVTwoModel("Queue"));
            tutorialSubList.add(new RVTwoModel("Binary Tree"));
            tutorialSubList.add(new RVTwoModel("Binary Search Tree"));
            tutorialSubList.add(new RVTwoModel("Heap"));
            tutorialSubList.add(new RVTwoModel("Hashing"));
            tutorialSubList.add(new RVTwoModel("Graph"));
            tutorialSubList.add(new RVTwoModel("Advanced Data Structure"));
            tutorialSubList.add(new RVTwoModel("Matrix"));
            tutorialSubList.add(new RVTwoModel("Strings"));
            tutorialSubList.add(new RVTwoModel("All Data Structures"));
  
        } else if (num == 3){
  
            tutorialSubList.add(new RVTwoModel("C"));
            tutorialSubList.add(new RVTwoModel("C++"));
            tutorialSubList.add(new RVTwoModel("Java"));
            tutorialSubList.add(new RVTwoModel("Python"));
            tutorialSubList.add(new RVTwoModel("C#"));
            tutorialSubList.add(new RVTwoModel("Javascript"));
            tutorialSubList.add(new RVTwoModel("JQuery"));
            tutorialSubList.add(new RVTwoModel("SQL"));
            tutorialSubList.add(new RVTwoModel("PHP"));
            tutorialSubList.add(new RVTwoModel("Scala"));
            tutorialSubList.add(new RVTwoModel("Perl"));
            tutorialSubList.add(new RVTwoModel("GO Language"));
            tutorialSubList.add(new RVTwoModel("HTML"));
            tutorialSubList.add(new RVTwoModel("CSS"));
            tutorialSubList.add(new RVTwoModel("Kotlin"));
  
        } else if (num == 4){
  
            tutorialSubList.add(new RVTwoModel("Company Preparation"));
            tutorialSubList.add(new RVTwoModel("Top Topics"));
            tutorialSubList.add(new RVTwoModel("Practice Company Questions"));
            tutorialSubList.add(new RVTwoModel("Interview Experiences"));
            tutorialSubList.add(new RVTwoModel("Experienced Interviews"));
            tutorialSubList.add(new RVTwoModel("Internship Interviews"));
            tutorialSubList.add(new RVTwoModel("Competitive Programming"));
            tutorialSubList.add(new RVTwoModel("Design Patterns"));
            tutorialSubList.add(new RVTwoModel("Multiple Choice Quizzes"));
  
        } else if (num == 5){
  
            tutorialSubList.add(new RVTwoModel("GATE CS Notes 2021"));
            tutorialSubList.add(new RVTwoModel("Last Minute Notes"));
            tutorialSubList.add(new RVTwoModel("GATE CS Solved Papers"));
            tutorialSubList.add(new RVTwoModel("GATE CS Original Papers and Official Keys"));
            tutorialSubList.add(new RVTwoModel("GATE 2021 Dates"));
            tutorialSubList.add(new RVTwoModel("GATE CS 2021 Syllabus"));
            tutorialSubList.add(new RVTwoModel("Important Topics for GATE CS"));
            tutorialSubList.add(new RVTwoModel("Sudo GATE 2021"));
  
        } else if (num == 6){
  
            tutorialSubList.add(new RVTwoModel("ISRO CS Solved Papers"));
            tutorialSubList.add(new RVTwoModel("ISRO CS Original Papers and Official Keys"));
            tutorialSubList.add(new RVTwoModel("ISRO CS Syllabus for Scientist/Engineer Exam"));
  
        } else if (num == 7){
            tutorialSubList.add(new RVTwoModel("UGC NET CS Notes Paper II"));
            tutorialSubList.add(new RVTwoModel("UGC NET CS Notes Paper III"));
            tutorialSubList.add(new RVTwoModel("UGC NET CS Solved Papers"));
  
        } else if (num == 8){
  
            tutorialSubList.add(new RVTwoModel("Mathematics"));
            tutorialSubList.add(new RVTwoModel("Operating System"));
            tutorialSubList.add(new RVTwoModel("DBMS"));
            tutorialSubList.add(new RVTwoModel("Computer Networks"));
            tutorialSubList.add(new RVTwoModel("Computer Organization and Architecture"));
            tutorialSubList.add(new RVTwoModel("Theory of Computation"));
            tutorialSubList.add(new RVTwoModel("Compiler Design"));
            tutorialSubList.add(new RVTwoModel("Digital Logic"));
            tutorialSubList.add(new RVTwoModel("Software Engineering"));
  
        } else if (num == 9){
  
            tutorialSubList.add(new RVTwoModel("HTML"));
            tutorialSubList.add(new RVTwoModel("CSS"));
            tutorialSubList.add(new RVTwoModel("Javascript"));
            tutorialSubList.add(new RVTwoModel("jQuery"));
            tutorialSubList.add(new RVTwoModel("PHP"));
  
        }
  
        rvTwoAdapter = new RVTwoAdapter(tutorialSubList);
        RVTwo.setAdapter(rvTwoAdapter);
    }
}

 

RVOneAdapter.java

Java

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import com.wheic.recyclergetsout.R;
import java.util.List;
  
public class RVOneAdapter extends RecyclerView.Adapter<RVOneAdapter.ViewHolder> {
  
  // Main-list item titles will be stored here  
  private List<RVOneModel> tutorialList; 
  
  // Need this clickListener for the Main-list item onClick events 
  private OnItemsClickListener listener; 
  
    // Parameterized constructor of this class to initialize tutorialList
    public RVOneAdapter(List<RVOneModel> tutorialList) {
        this.tutorialList = tutorialList;
  
    }
  
    // Main-list item clickListener is initialized
    // This will be used in MainActivity
    public void setWhenClickListener(OnItemsClickListener listener){
        this.listener = listener;
    }
  
    // Attach the item layout with the proper xml file
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_card_layout, parent, false);
        return new ViewHolder(view);
    }
  
    // It deals with the setting of different data and methods
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final RVOneModel modelItems = tutorialList.get(position);
        holder.setData(tutorialList.get(position).getName());
        holder.singleItemCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(listener != null){
                    listener.onItemClick(modelItems);
                }
            }
        });
    }
  
    // It returns the length of the RecyclerView
    @Override
    public int getItemCount() {
        return tutorialList.size();
    }
  
    // The ViewHolder is a java class that stores 
      // the reference to the item layout views
    public class ViewHolder extends RecyclerView.ViewHolder{
  
        public CardView singleItemCardView;
        public TextView singleItemTextView;
  
        // Link up the Main-List items layout components with their respective id
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            singleItemCardView = itemView.findViewById(R.id.singleItemCardView);
            singleItemTextView = itemView.findViewById(R.id.singleItemTextView);
        }
  
        // setText in Main-List title text
        public void setData(String name){
            this.singleItemTextView.setText(name);
        }
    }
  
    // Interface to perform events on Main-List item click
    public interface OnItemsClickListener{
        void onItemClick(RVOneModel rvOneModel);
    }
}

 

RVOneModel.java

Java

public class RVOneModel {
      // this variable will store main-list item title
    private String name; 
       // this will help differentiate between the main-list items
    private int num;
  
    // parameterized constructor
    public RVOneModel(String name, int num) {
        this.name = name;
        this.num = num;
    }
  
    // getter functions for these two variables
    public String getName() {
        return name;
    }
  
    public int getNum() {
        return num;
    }
}

 

RVTwoAdapter.java

Java

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.wheic.recyclergetsout.R;
import java.util.List;
  
public class RVTwoAdapter extends RecyclerView.Adapter<RVTwoAdapter.ViewHolder> {
  
       // Sub-list item titles will be stored here
    private List<RVTwoModel> tutorialSubList;
  
    // Parameterized constructor of this 
      // class to initialize tutorialSubList
    public RVTwoAdapter(List<RVTwoModel> tutorialSubList) {
        this.tutorialSubList = tutorialSubList;
    }
  
    // Attach the item layout with the proper xml file
    @NonNull
    @Override
    public RVTwoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_card_layout_vertical, parent, false);
        return new ViewHolder(view);
    }
  
    // It deals with the setting of different data and methods
    @Override
    public void onBindViewHolder(@NonNull RVTwoAdapter.ViewHolder holder, int position) {
        holder.setData(tutorialSubList.get(position).getName());
    }
  
    // It returns the length of the RecyclerView
    @Override
    public int getItemCount() {
        return tutorialSubList.size();
    }
  
    // The ViewHolder is a java class that stores 
      // the reference to the item layout views
    public class ViewHolder extends RecyclerView.ViewHolder{
  
        public TextView rvTwoText;
  
        // Link up the Sub-List items layout components with their respective id
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            rvTwoText = itemView.findViewById(R.id.singleItemTextViewRVTwo);
        }
  
        // setText in Sub-List title text
        public void setData(String name){
            this.rvTwoText.setText(name);
        }
    }
}

 

RVTwoModel.java

Java

public class RVTwoModel {
       // this variable will store sub-list item title
    private String name;
  
    // parameterized constructor
    public RVTwoModel(String name) {
        this.name = name;
    }
  
    // getter function for the name variable
    public String getName() {
        return name;
    }
}

Producción:

Puede consultar este proyecto desde este enlace de GitHub .

Publicación traducida automáticamente

Artículo escrito por jeetnath y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *