简体   繁体   English

回收视图上的Android单选按钮取消选中滚动

[英]Android radio button on Recycle View uncheck on scrolling

I am implementing a RecycleView that contains two view types. 我正在实现一个RecycleView,其中包含两种视图类型。 One view type contains a TextView and other contains a RadioButton. 一种视图类型包含一个TextView,另一种视图类型包含一个RadioButton。 I maintain an array list to keep radio button check/uncheck status. 我维护一个数组列表,以保持单选按钮的选中/取消选中状态。 But sometimes RadioButton get uncheck even I set check status using array List on scrolling. 但是有时候,即使我在滚动时使用数组List设置了检查状态,RadioButton也会取消选中。

here is my adapter class 这是我的适配器类

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);
    }
}

} }

use logic below on onBindView: 在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);


        }
    });

Explanation: 说明:

Recycle view inflate eveytime when you scroll down or up. 向下或向上滚动时,回收视图会增加传送时间。 you need to store a flag in the data pojo to keep track of check status using that flag with setOnCheckedChangeListener will enable you to have you checked enable/disable .make sure you put flag after listener. 您需要在数据pojo中存储一个标记以跟踪检查状态,使用带有setOnCheckedChangeListener的标记可以使您选中启用/禁用。请确保将标记放在侦听器之后。

Save the state of your radio button by giving them dynamic tags and saving there state to a hashmap on onChecked() method of radio button. 通过为单选按钮提供动态标签,并将单选按钮的onChecked()方法上的状态标签保存到哈希图中,以onChecked()单选按钮的状态。 And check there state while inflating recycle view. 并在扩大回收视图的同时检查状态。 Please comment if more explanation is required.. 如果需要更多说明,请发表评论。

When you check radio button every time you have to save(you can save on an arraylist) the checked state. 每次必须单选按钮时,必须保存(可以保存在阵列列表中)选中状态。 And every time of creating view (inside adapter) you have to check the state of radio button (check from arraylist where you save the states). 每次创建视图时(在适配器内部),您都必须检查单选按钮的状态(从保存状态的arraylist中检查)。 If you get it is checked then you have to checked the radio button programmatically. 如果得到检查,则必须以编程方式检查单选按钮。 Hope you understand well. 希望你能理解。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM