回收单上的Android Radio按钮在滚动时取消选中



我正在实现一个包含两种视图类型的回收视图。一种视图类型包含一个文本视图,另一种包含一个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检查)。如果您获得了检查,则必须以编程方式检查单选按钮。希望你能很好地了解。

最新更新