Open In App

How to Select Single RadioButton in Android RecyclerView?

Improve
Improve
Like Article
Like
Save
Share
Report

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




<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:tools="http://schemas.android.com/tools"
    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




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

Java




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.

Java




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-

Java




package com.example.singleradiobuttonrv;
  
public interface ItemClickListener {
    // Create method
    void onClick(String s);
}


Here is the final output of our application.

Output:



Last Updated : 20 Mar, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads