Android recyclerview中的Radiogroup
我有一个recyclerview,其中每个列表项都有一个带有4个单选按钮的radiogroup。如何正确存储每个放射组的状态。 这是我的密码。向上/向下滚动时,状态不正确。谢谢Android recyclerview中的Radiogroup,android,android-recyclerview,android-radiogroup,Android,Android Recyclerview,Android Radiogroup,我有一个recyclerview,其中每个列表项都有一个带有4个单选按钮的radiogroup。如何正确存储每个放射组的状态。 这是我的密码。向上/向下滚动时,状态不正确。谢谢 public class ElementListAdapter extends RecyclerView.Adapter<ElementListAdapter.ViewHolder> { private List<Element> elements = new ArrayList<
public class ElementListAdapter extends RecyclerView.Adapter<ElementListAdapter.ViewHolder> {
private List<Element> elements = new ArrayList<>();
private Context context;
private int[] state;
public ElementListAdapter(Context context, List<Element> elements) {
this.context = context;
this.elements = elements;
this.state = new int[elements.size()];
Arrays.fill(this.state, -1);
}
@Override
public ElementListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent,
false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final Element ele = elements.get(position);
final String title = ele.getTitle();
final String description = ele.getDescription();
// Set text
holder.tvTitle.setText(title);
holder.tvDesciption.setText(description);
if (ele.isHeader()) {
holder.radioGroup.setVisibility(View.GONE);
} else {
holder.radioGroup.setVisibility(View.VISIBLE);
}
setRadio(holder, this.state[position]);
holder.rb1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
state[position] = 0;
setRadio(holder, state[position]);
}
});
holder.rb2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
state[position] = 1;
setRadio(holder, state[position]);
}
});
holder.rb3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
state[position] = 2;
setRadio(holder, state[position]);
}
});
holder.rb4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
state[position] = 3;
setRadio(holder, state[position]);
}
});
}
private void setRadio(final ViewHolder holder, int selection) {
System.out.println("SELECT:" + selection);
RadioButton b1 = holder.rb1;
RadioButton b2 = holder.rb2;
RadioButton b3 = holder.rb3;
RadioButton b4 = holder.rb4;
b1.setChecked(false);
b2.setChecked(false);
b3.setChecked(false);
b4.setChecked(false);
if (selection == 0) b1.setChecked(true);
if (selection == 1) b2.setChecked(true);
if (selection == 2) b3.setChecked(true);
if (selection == 3) b4.setChecked(true);
}
@Override
public int getItemCount() {
return elements.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public View view;
public TextView tvTitle;
public TextView tvDesciption;
public RadioGroup radioGroup;
public RadioButton rb1, rb2, rb3, rb4;
public ViewHolder(View itemView) {
super(itemView);
view = itemView;
tvTitle = (TextView) itemView.findViewById(R.id.title);
tvDesciption = (TextView) itemView.findViewById(R.id.description);
radioGroup = (RadioGroup) itemView.findViewById(R.id.radioGroup);
rb1 = (RadioButton) itemView.findViewById(R.id.rb1);
rb2 = (RadioButton) itemView.findViewById(R.id.rb2);
rb3 = (RadioButton) itemView.findViewById(R.id.rb3);
rb4 = (RadioButton) itemView.findViewById(R.id.rb4);
}
}
}
公共类ElementListAdapter扩展了RecyclerView.Adapter{
私有列表元素=新的ArrayList();
私人语境;
私有国家;
公共元素ListAdapter(上下文、列表元素){
this.context=上下文;
这个元素=元素;
this.state=newint[elements.size()];
数组.fill(this.state,-1);
}
@凌驾
public ElementListAdapter.ViewHolder onCreateViewHolder(ViewGroup父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext())。充气(R.layout.list\u item\u布局,parent,
假);
返回新的视图持有者(v);
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
最终元素ele=元素get(位置);
最终字符串title=ele.getTitle();
final String description=ele.getDescription();
//设置文本
holder.tvTitle.setText(标题);
holder.tDescription.setText(说明);
if(ele.ishader()){
holder.radioGroup.setVisibility(视图已消失);
}否则{
支架.射线组.设置可见性(视图.可见);
}
setRadio(支架,该状态[位置]);
holder.rb1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
状态[位置]=0;
setRadio(支架,状态[位置]);
}
});
holder.rb2.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
状态[位置]=1;
setRadio(支架,状态[位置]);
}
});
holder.rb3.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
状态[位置]=2;
setRadio(支架,状态[位置]);
}
});
holder.rb4.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
状态[位置]=3;
setRadio(支架,状态[位置]);
}
});
}
专用void setRadio(最终视图持有者,int选择){
System.out.println(“选择:”+选择);
单选按钮b1=支架。rb1;
RadioButton b2=支架。rb2;
单选按钮b3=支架。rb3;
RadioButton b4=支架。rb4;
b1.设置检查(假);
b2.设置检查(假);
b3.设置检查(假);
b4.设置检查(假);
如果(选择==0)b1.setChecked(真);
如果(选择==1)b2.setChecked(真);
如果(选择==2)b3.setChecked(真);
如果(选择==3)b4.setChecked(真);
}
@凌驾
public int getItemCount(){
返回元素。size();
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公众观点;
公共文本视图tvTitle;
公共文本视图电视描述;
公共放射组放射组;
公共单选按钮rb1、rb2、rb3、rb4;
公共视图持有者(视图项视图){
超级(项目视图);
视图=项目视图;
tvTitle=(TextView)itemView.findViewById(R.id.title);
TVDescription=(TextView)itemView.findViewById(R.id.description);
radioGroup=(radioGroup)itemView.findViewById(R.id.radioGroup);
rb1=(RadioButton)itemView.findViewById(R.id.rb1);
rb2=(RadioButton)itemView.findViewById(R.id.rb2);
rb3=(RadioButton)itemView.findViewById(R.id.rb3);
rb4=(RadioButton)itemView.findViewById(R.id.rb4);
}
}
}
保存项目状态的最佳方法是将状态变量放置在列表的项目模型
中,例如:案例中的“元素”,而不是onBindViewHolder
中,根据您的模型设置状态,在您的案例中:
更改此:setRadio(保持架,此状态[位置])代码>
对此:setRadio(holder,elements.get(position.getState())代码>
及
内部onClick方法
例:第一次
更改此项:
状态[位置]=0代码>
setRadio(保持架,该状态[位置])代码>
为此:
elements.get(位置).setState(0)代码>
setRadio(holder,elements.get(position.getState())代码>我就是这么做的。在我的onBindViewHolder中
if(visualScore[position] == 1 ){
holder.rg.check(R.id.rb_1);
}else{
if(audioScore[position] == 1){
holder.rg.check(R.id.rb_2);
}else{
if(kinestScore[position] == 1){
holder.rg.check(R.id.rb_3);
}else{
holder.rg.clearCheck();
}
}
}
holder.rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
switch (checkedId) {
case (R.id.rb_1):
visualScore[position] = 1;
audioScore[position] = 0;
kinestScore[position] = 0;
break;
case (R.id.rb_2):
visualScore[position] = 0;
audioScore[position] = 1;
kinestScore[position] = 0;
break;
case (R.id.rb_3):
visualScore[position] = 0;
audioScore[position] = 0;
kinestScore[position] = 1;
break;
}
});
我在适配器类中将所有score数组声明为私有全局方法。然后,单击“提交”按钮时:
int v = 0, a = 0, k = 0;
for (int i = 0; i < Questions.length; i++){
v += visualScore[i];
a += audioScore[i];
k += kinestScore[i];
}
intv=0,a=0,k=0;
for(int i=0;i
实现这一点的最佳方法和最有效的方法是简单地向类中添加一个包含选项(单选按钮)的变量。在onClick()之后,只需将选择的单选按钮指定给变量并获取该变量
首先,在元素类中添加一个变量,用于存储选中的单选按钮选项
那么
视图持有者会循环使用,因此默认情况下无法保持状态。一种解决方案是动态存储状态(检查适配器位置)并将其恢复到onBindViewHolder中。不要触发任何一次检查更改,谢谢您的回复。它似乎仍然不起作用:/I我做了建议的更改并删除了setChecked(false),它似乎起作用了。非常感谢:)并不是说我的方法更好,但这是一个解决办法。onCheckedCha
public class ElementListAdapter extends RecyclerView.Adapter<ElementListAdapter.ViewHolder> {
private List<Element> elements = new ArrayList<>();
private Context context;
//instance of interface created
final private ListItemClickListener myOnClickListener;
private int[] state;
//create a interface which helps to communicates with your main activity
public interface ListItemClickListener
{
void onListItemClick(int clickItemIndex,String optionSelected);
}
public ElementListAdapter(Context context, List<Element> elements) {
this.context = context;
this.elements = elements;
this.state = new int[elements.size()];
Arrays.fill(this.state, -1);
}
@Override
public ElementListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent,
false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final Element ele = elements.get(position);
final String title = ele.getTitle();
final String description = ele.getDescription();
// Set text
holder.tvTitle.setText(title);
holder.tvDesciption.setText(description);
if (ele.isHeader()) {
holder.radioGroup.setVisibility(View.GONE);
} else {
holder.radioGroup.setVisibility(View.VISIBLE);
}
holder.setIsRecyclable(false);
//here you check the option selected
switch (Element.getUserOption()) {
case "1":
holder.rb1.setChecked(true);
break;
case "2":
holder.rb2.setChecked(true);
break;
case "3":
holder.rb3.setChecked(true);
break;
case "4":
holder.rb4.setChecked(true);
break;
default:
holder.radioGroup.clearCheck();
}
}
@Override
public int getItemCount() {
return elements.size();
}
//make sure to implement onClickListener here
public static class ViewHolder extends RecyclerView.ViewHolder implements View.onClickListener {
public View view;
public TextView tvTitle;
public TextView tvDesciption;
public int clickedCardPosition;
public RadioGroup radioGroup;
public RadioButton rb1, rb2, rb3, rb4;
public ViewHolder(View itemView) {
super(itemView);
view = itemView;
tvTitle = (TextView) itemView.findViewById(R.id.title);
tvDesciption = (TextView) itemView.findViewById(R.id.description);
radioGroup = (RadioGroup) itemView.findViewById(R.id.radioGroup);
rb1 = (RadioButton) itemView.findViewById(R.id.rb1);
rb2 = (RadioButton) itemView.findViewById(R.id.rb2);
rb3 = (RadioButton) itemView.findViewById(R.id.rb3);
rb4 = (RadioButton) itemView.findViewById(R.id.rb4);
rb1.setOnClickListener(this);
rb2.setOnClickListener(this);
rb3.setOnClickListener(this);
rb4.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int clickedCardPosition = getAdapterPosition();
if(rb1.isPressed()) myOnClickListener.onListItemClick(clickedCardPosition, "1");
if(rb2.isPressed()) myOnClickListener.onListItemClick(clickedCardPosition,"2");
if(rb3.isPressed()) myOnClickListener.onListItemClick(clickedCardPosition,"3");
if(rb4.isPressed()) myOnClickListener.onListItemClick(clickedCardPosition,"4");
}
}
}
//implement here
public class YourMainActivity extends AppCompatActivity implements
recyclerAdapter.ListItemClickListener{
.
.
.
.
.
@Override
public void onListItemClick(int clickItemIndex, String optionSelected) {
//Here assign the value to the Element Obj
yourList.get(clickItemIndex).setUserOption(optionSelected);
yourAdapter.notifyDataSetChanged();
}
}