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