RecyclerView is a ViewGroup added to the android studio as a successor of the GridView and ListView. It is an improvement on both of them and can be found in the latest v-7 support packages. It has been created to make possible the construction of any lists with XML layouts as an item that can be customized vastly while improving the efficiency of ListViews and GridViews. In this article, we are going to see how to select a single RadioButton while working on a RecyclerView.
What we are going to build in this article?
Here is a sample video of what we are going to build in this application. Note that we will be using Java language to make this project.
Step by Step Implementation
Step 1: Create a New Project
- Open a new project.
- We will be working on Empty Activity with language as Java. Leave all other options unchanged.
- Name the application at your convenience.
- There will be two default files named activity_main.xml and MainActivity.java.
If you don’t know how to create a new project in Android Studio then you can refer to How to Create/Start a New Project in Android Studio?
Step 2. Adding required dependency
Navigate to Gradle Scripts > gradle.scripts(module) and add the following dependency to it
implementation 'com.google.android.material:material:1.3.0'
Step 3. Working on XML files
Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file.
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:padding = "16dp"
tools:context = ".MainActivity" >
< androidx.recyclerview.widget.RecyclerView
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:id = "@+id/recycler_view"
tools:listitem = "@layout/item_main" />
</ RelativeLayout >
|
Navigate to app > res > layout > right-click > new > layout resource file and name it as item_main.xml. Use the following code in item_main.xml file-
<? xml version = "1.0" encoding = "utf-8" ?>
< RadioButton
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:id = "@+id/radio_button"
android:padding = "12dp"
android:textSize = "18sp"
android:textColor = "@android:color/darker_gray" >
</ RadioButton >
|
Step 4. Working on Java files
Navigate to the MainActivity.java file and use the following code in it. Comments are added to the code to have a better understanding.
package com.example.singleradiobuttonrv;
import android.os.Bundle;
import android.service.autofill.LuhnChecksumValidator;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
// Initialize variable
RecyclerView recyclerView;
ItemClickListener itemClickListener;
MainAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Assign variable
recyclerView = findViewById(R.id.recycler_view);
// initialize array list
ArrayList<String> arrayList = new ArrayList<>();
// Use for loop
for ( int i = 0 ; i < 20 ; i++) {
// add values in array list
arrayList.add( "RB " + i);
}
// Initialize listener
itemClickListener = new ItemClickListener() {
@Override public void onClick(String s)
{
// Notify adapter
recyclerView.post( new Runnable() {
@Override public void run()
{
adapter.notifyDataSetChanged();
}
});
// Display toast
Toast
.makeText(getApplicationContext(),
"Selected : " + s,
Toast.LENGTH_SHORT)
.show();
}
};
// Set layout manager
recyclerView.setLayoutManager( new LinearLayoutManager( this ));
// Initialize adapter
adapter = new MainAdapter(arrayList, itemClickListener);
// set adapter
recyclerView.setAdapter(adapter);
}
} |
Navigate to app > right-click > new > java class and name it as MainAdapter.java. Use the following code in it. Comments are added to the code to have a better understanding.
package com.example.singleradiobuttonrv;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.AdapterListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView;
import java.io.*;
import java.util.ArrayList;
public class MainAdapter
extends RecyclerView.Adapter<MainAdapter.ViewHolder> {
// Initialize variable
ArrayList<String> arrayList;
ItemClickListener itemClickListener;
int selectedPosition = - 1 ;
// Create constructor
public MainAdapter(ArrayList<String> arrayList,
ItemClickListener itemClickListener)
{
this .arrayList = arrayList;
this .itemClickListener = itemClickListener;
}
@NonNull
@Override
public ViewHolder
onCreateViewHolder( @NonNull ViewGroup parent,
int viewType)
{
// Initialize view
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_main, parent,
false );
// Pass holder view
return new ViewHolder(view);
}
@Override
public void onBindViewHolder( @NonNull ViewHolder holder,
int position)
{
// Set text on radio button
holder.radioButton.setText(arrayList.get(position));
// Checked selected radio button
holder.radioButton.setChecked(position
== selectedPosition);
// set listener on radio button
holder.radioButton.setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(
CompoundButton compoundButton,
boolean b)
{
// check condition
if (b) {
// When checked
// update selected position
selectedPosition
= holder.getAdapterPosition();
// Call listener
itemClickListener.onClick(
holder.radioButton.getText()
.toString());
}
}
});
}
@Override public long getItemId( int position)
{
// pass position
return position;
}
@Override public int getItemViewType( int position)
{
// pass position
return position;
}
@Override public int getItemCount()
{
// pass total list size
return arrayList.size();
}
public class ViewHolder
extends RecyclerView.ViewHolder {
// Initialize variable
RadioButton radioButton;
public ViewHolder( @NonNull View itemView)
{
super (itemView);
// Assign variable
radioButton
= itemView.findViewById(R.id.radio_button);
}
}
} class GFG {
public static void main(String[] args)
{
System.out.println( "GFG!" );
}
} |
Create a new interface and name it as ItemClickListener. Use the following code in the ItemClickListener.java file-
package com.example.singleradiobuttonrv;
public interface ItemClickListener {
// Create method
void onClick(String s);
} |
Here is the final output of our application.
Output: