Android RecyclerView配合RadioButton实现多个条目单选

前言:最近做项目,做到一个需求是调查问卷的模块,因为不知道题目的数量和选项的数量,所以单选的地方需要RecyclerView配合RadioButton来展示数据,下面我们就来实现以下这个功能;

我的由于特殊需求是RecyclerView嵌套的RecyclerView,主要

功能逻辑代码都在SecondAdapter里面

废话不多说,老规矩,先上效果图


先贴上布局代码

1.主布局:activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.example.administrator.myapplication.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_test"
        android:layout_gravity="center_horizontal"
        android:layout_width="325dp"
        android:layout_height="wrap_content">

    </android.support.v7.widget.RecyclerView>

</LinearLayout>

2.子条目布局:layout_radio

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    android:layout_height="wrap_content">
    <!--单项选择-->
    <TextView
        android:id="@+id/tv_question_radio"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:text="获取题目中..."
        android:textSize="14sp"
        android:textStyle="bold" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_question_radio"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"></android.support.v7.widget.RecyclerView>

    <View
        android:background="#dddddd"
        android:layout_marginTop="12dp"
        android:layout_width="match_parent"
        android:layout_height="0.5dp"/>
</LinearLayout>

3.子选项布局:item_radio

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="18dp"
    android:layout_height="wrap_content">
    <!--单选-->
    <RadioButton
        android:id="@+id/rb_question_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:text="获取选项中"
        android:id="@+id/tv_question_item"
        android:layout_marginLeft="9dp"
        android:textSize="13sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

4.主布局代码:MainActivity

package com.example.administrator.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import com.example.administrator.myapplication.adapter.FirstAdapter;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView rv_test;
    private ArrayList<String> firstList = new ArrayList<>();
    private ArrayList<String> secondList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //条目模拟数据
        firstList.add("1.单选:你是谁");
        firstList.add("2.单选:你是谁");
        firstList.add("3.单选:你是谁");
        firstList.add("4.单选:你是谁");
        firstList.add("5.单选:你是谁");
        //选项模拟数据
        secondList.add("选项A");
        secondList.add("选项B");
        secondList.add("选项C");
        secondList.add("选项D");
        secondList.add("选项E");
        rv_test = findViewById(R.id.rv_test);
        //RecyclerView适配器
        rv_test.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));
        FirstAdapter firstAdapter = new FirstAdapter(MainActivity.this,firstList,secondList);
        rv_test.setAdapter(firstAdapter);
    }
}

5.展示题目适配器:FirstAdapter

package com.example.administrator.myapplication.adapter;

import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.administrator.myapplication.R;

import java.util.ArrayList;

/**
 * Created by Administrator on 2018/3/23.
 */

public class FirstAdapter extends RecyclerView.Adapter<FirstAdapter.MyViewHolder> {

    private Context context;
    private ArrayList<String> firstList;
    private ArrayList<String> secondList;

    public FirstAdapter(Context context, ArrayList<String> firstList, ArrayList<String> secondList) {
        this.context = context;
        this.firstList = firstList;
        this.secondList = secondList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(context).inflate(R.layout.layout_radio, null);
        MyViewHolder myViewHolder = new MyViewHolder(inflate);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.tv_question_radio.setText(firstList.get(position));
        //RecyclerView嵌套
        holder.rv_question_radio.setLayoutManager(new GridLayoutManager(context,2, LinearLayoutManager.VERTICAL,false));
        holder.rv_question_radio.setAdapter(new SecondAdapter(context,secondList));
    }

    @Override
    public int getItemCount() {
        return firstList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView tv_question_radio;
        RecyclerView rv_question_radio;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv_question_radio = itemView.findViewById(R.id.tv_question_radio);
            rv_question_radio = itemView.findViewById(R.id.rv_question_radio);
        }
    }

}

6.子选项适配器:SecondAdapter

package com.example.administrator.myapplication.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

import com.example.administrator.myapplication.R;

import java.util.ArrayList;

/**
 * Created by Administrator on 2018/3/23.
 */

public class SecondAdapter extends RecyclerView.Adapter<SecondAdapter.MyViewHolder> {

    private Context context;
    private ArrayList<String> secondList;
    private int index = -1;//标记当前选择的选项

    public SecondAdapter(Context context, ArrayList<String> secondList) {
        this.context = context;
        this.secondList = secondList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(context).inflate(R.layout.item_radio, null);
        MyViewHolder myViewHolder = new MyViewHolder(inflate);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        holder.tv_question_item.setText(secondList.get(position));
        holder.rb_question_item.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    Toast.makeText(context,"你选择的选项是"+secondList.get(position),Toast.LENGTH_SHORT).show();
                    index = position;
                    notifyDataSetChanged();
                }
            }
        });
        if(index==position){
            holder.rb_question_item.setChecked(true);
        } else {
            holder.rb_question_item.setChecked(false);
        }
    }

    @Override
    public int getItemCount() {
        return secondList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        RadioButton rb_question_item;
        TextView tv_question_item;
        public MyViewHolder(View itemView) {
            super(itemView);
            rb_question_item = itemView.findViewById(R.id.rb_question_item);
            tv_question_item = itemView.findViewById(R.id.tv_question_item);
        }
    }

}

7.好了,到这里我们的小Demo就已经完成了,复制即可用,阅读即可懂


得意得意得意



用起来如果有瑕疵的话可以参考另一个逻辑

Android RecyclerView中使用CheckBox勾选实现单选功能





猜你喜欢

转载自blog.csdn.net/qq1271396448/article/details/79664952