滚动

时间:2017-09-20 05:42:47

标签: android

我正在实现一个包含两种视图类型的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);
    }
}

}

3 个答案:

答案 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中检查保存状态的位置)。如果你得到它,那么你必须以编程方式检查单选按钮。希望你能理解。