我正在实现一个包含两种视图类型的RecycleView。一种视图类型包含TextView,另一种包含RadioButton。 我维护一个数组列表,以保持单选按钮检查/取消选中状态。但有时即使我在滚动时使用数组List设置检查状态,RadioButton也会取消选中。
这是我的适配器类
public class AddItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<Object> items=null;
private final int MENU_OPTION = 0;
private final int MENU_CHOICE = 1;
private Context context;
private int prevSelectedItem=-1;
private RadioButton prevSelectedRdBtn=null;
public AddItemsAdapter(Context context, ArrayList<Object> items) {
this.items = items;
this.context = context;
}
@Override
public int getItemCount() {
return this.items.size();
}
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof MenuOption) {
return MENU_OPTION;
} else if (items.get(position) instanceof MenuChoice) {
return MENU_CHOICE;
}
else {
return -1;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
switch (viewType) {
case MENU_OPTION:
View v1 = inflater.inflate(R.layout.menu_option, viewGroup, false);
viewHolder = new VMMenuOptionHolder(v1);
break;
case MENU_CHOICE:
View v2 = inflater.inflate(R.layout.menu_choice, viewGroup, false);
viewHolder = new VMMenuChoiceHolder(v2);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int i) {
try {
switch (viewHolder.getItemViewType()) {
case MENU_OPTION:
VMMenuOptionHolder vh1 = (VMMenuOptionHolder) viewHolder;
MenuOption dt= (MenuOption) items.get(i);
vh1.title.setText(dt.getOptionTitle());
vh1.choiceNote.setText(" - Select "+dt.getMaxChoiceAllowed()+" Choices");
break;
case MENU_CHOICE:
final VMMenuChoiceHolder vh2 = (VMMenuChoiceHolder) viewHolder;
MenuChoice mc= (MenuChoice) items.get(i);
vh2.radioButton.setChecked(mc.isSelect());
vh2.radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (prevSelectedItem!=i && prevSelectedRdBtn!=vh2.radioButton) {
selectChoice(i,vh2);
}
}
});
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void selectChoice(int pos, VMMenuChoiceHolder vh2) {
MenuChoice mc=(MenuChoice) items.get(pos);
mc.setSelect(true);
vh2.choiceNote.setText(" - Select "+mc.getMaxChoiceAllowed()+" Choices");
if(!mc.getSubMenuChoicesList().isEmpty()){
items.addAll(pos+1,mc.getSubMenuChoicesList());
}
if (prevSelectedItem != -1 && prevSelectedRdBtn!= null) {
((MenuChoice) items.get(prevSelectedItem)).setSelect(false);
prevSelectedRdBtn.setChecked(false);
}
notifyDataSetChanged();
prevSelectedItem=pos;
prevSelectedRdBtn=vh2.radioButton;
}
private class VMMenuChoiceHolder extends RecyclerView.ViewHolder{
TextView choiceNote;
RadioButton radioButton;
CheckBox checkBox;
VMMenuChoiceHolder(final View v2) {
super(v2);
radioButton=v2.findViewById(R.id.radioButton);
checkBox=v2.findViewById(R.id.checkBox);
choiceNote=v2.findViewById(R.id.choice_note);
}
}
}
答案 0 :(得分:0)
在onBindView上使用以下逻辑:
holder.attenCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (holder.attenCheckBox.isChecked())
dataModel.setChecked(true);
else
dataModel.setChecked(false);
}
});
if (dataModel.getChecked())
holder.attenCheckBox.setChecked(true);
else
holder.attenCheckBox.setChecked(false);
holder.checkboxLinearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.attenCheckBox.isChecked())
holder.attenCheckBox.setChecked(false);
else
holder.attenCheckBox.setChecked(true);
}
});
说明:
向下或向上滚动时,回收查看会延长eveytime。 您需要在数据pojo中存储一个标志以跟踪检查状态 使用setOnCheckedChangeListener的那个标志可以让你检查启用/禁用。确保你在监听器之后放置标志。
答案 1 :(得分:0)
保存单选按钮的状态,方法是为它们提供动态标记,并将状态保存到onChecked()
单选按钮方法的哈希映射中。并在充气循环视图时检查那里状态。如果需要更多解释,请评论..
答案 2 :(得分:0)
当你每次必须保存(你可以保存在arraylist上)检查状态时,检查单选按钮。每次创建视图(内部适配器)时,都必须检查单选按钮的状态(从arraylist中检查保存状态的位置)。如果你得到它,那么你必须以编程方式检查单选按钮。希望你能理解。