我正在实现一个包含两种视图类型的回收视图。一种视图类型包含一个文本视图,另一种包含一个radiobutton。我维护一个数组列表,以保持广播按钮检查/取消选中状态。但是有时候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);
}
}
}
在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一起使用将使您可以检查/disable。确保在侦听器之后放置标志。
通过给出动态标签并将其保存到 onChecked()
单台上的hashmap上,保存了单个单选按钮的状态。并在充气回收视图时检查那里的状态。如果需要更多解释,请评论。
在每次必须保存时检查单选按钮时(可以保存在ArrayList上)检查状态。并且每次创建视图(在适配器内部)您都必须检查广播按钮的状态(从保存状态的ArrayList检查)。如果您获得了检查,则必须以编程方式检查单选按钮。希望你能很好地了解。