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:
- Cómo instalar Android Studio
- Configuración de un nuevo proyecto en Android Studio
- ¿Qué es RecyclerView?
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:
- Haga clic derecho en la carpeta recién creada (RV1) -> Nuevo -> Clase Java . Dar el nombre de la clase. Lo llamé RVOneModel .
- 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.
- 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:
- 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 .
- Entonces, con el adaptador, también necesitamos una clase ViewHolder .
- El uso de estas clases y cualquier otro método ya se describen claramente en este enlace GFG.
- 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:
- 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.
- 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:
- Haga clic derecho en la carpeta recién creada (RV2) -> Nuevo -> Clase Java . Dar el nombre de la clase. para mí es RVTwoModel .
- 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.
- 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:
- Haga clic derecho en la carpeta recién creada (RV2) -> Nuevo -> Clase Java . Dar el nombre de la clase. Lo llamé RVTwoAdapter .
- Al igual que cualquier otro RecyclerView, esta clase de adaptador tampoco es tan diferente.
- 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:
- 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;
- Se crea una función solo para el recyclerView vertical, que toma un parámetro entero.
- 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 .