前言:最近做项目,做到一个需求是调查问卷的模块,因为不知道题目的数量和选项的数量,所以单选的地方需要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勾选实现单选功能