【问题标题】:Radiogroup swaps position in recyclerviewRadiogroup 在 recyclerview 中交换位置
【发布时间】:2015-12-30 12:15:28
【问题描述】:

当我单击复选框时,收音机将可见,当我取消选中它时,它将不可见。但是当我向下滚动并再次查看相同时,如果我取消选中,收音机组将可见。并且当我向下滚动时它会重复.

private List<MarkAttendance_info> stList;

public MarkAttendance_Adapter(List<MarkAttendance_info> students) {
    this.stList = students;

}

// Create new views
@Override
public MarkAttendance_Adapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                            int viewType) {
    // create a new view
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
            R.layout.mark_attendance, null);

    // create ViewHolder

    ViewHolder viewHolder = new ViewHolder(itemLayoutView);

    return viewHolder;
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {

    final int pos = position;

    viewHolder.tvName.setText(stList.get(position).getStudentname());

    viewHolder.tvEmailId.setText(stList.get(position).getStudentid());

    viewHolder.stupkey.setText(stList.get(position).getStudentPkey());

    viewHolder.chkSelected.setChecked(stList.get(position).isSelected());

    viewHolder.chkSelected.setTag(stList.get(position));

    viewHolder.chkSelected.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            CheckBox cb = (CheckBox) v;
            MarkAttendance_info contact = (MarkAttendance_info) cb.getTag();

            contact.setSelected(cb.isChecked());
            stList.get(pos).setSelected(cb.isChecked());

            if(cb.isChecked())
            {
                viewHolder.grades.setVisibility(View.VISIBLE);
            }
            else
            {
                viewHolder.grades.setVisibility(View.GONE);
            }



            Toast.makeText(
                    v.getContext(),
                    "Clicked on Checkbox: " + cb.getText() + " is "
                            + cb.isChecked(), Toast.LENGTH_LONG).show();
        }
    });

    viewHolder.grades.setTag(stList.get(position));
    setRadio(viewHolder, stList.get(position).getCheckedId());

    viewHolder.a.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            stList.get(position).setCheckedId(0);
            setRadio(viewHolder, stList.get(position).getCheckedId());
        }
    });
    viewHolder.b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view)
        {
            stList.get(position).setCheckedId(1);
            setRadio(viewHolder, stList.get(position).getCheckedId());
        }
    });
    viewHolder.c.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            stList.get(position).setCheckedId(2);
            setRadio(viewHolder, stList.get(position).getCheckedId());
        }
    });
    viewHolder.d.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            stList.get(position).setCheckedId(3);
            setRadio(viewHolder, stList.get(position).getCheckedId());
        }
    });
    viewHolder.e.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            stList.get(position).setCheckedId(4);
            setRadio(viewHolder, stList.get(position).getCheckedId());
        }
    });


}
private void setRadio(final ViewHolder holder, int selection) {

    System.out.println("SELECT:" + selection);
    RadioButton b1 = holder.a;
    RadioButton b2 = holder.b;
    RadioButton b3 = holder.c;
    RadioButton b4 = holder.d;
    RadioButton b5 = holder.e;

    if (selection == 0) b1.setChecked(true);
    if (selection == 1) b2.setChecked(true);
    if (selection == 2) b3.setChecked(true);
    if (selection == 3) b4.setChecked(true);
    if (selection == 4) b5.setChecked(true);

}

// Return the size arraylist
@Override
public int getItemCount()
{
    return stList.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {

    public TextView tvName;
    public TextView tvEmailId;
    public TextView stupkey;

    public CheckBox chkSelected;

    public RadioGroup grades;
    public RadioButton a;
    public RadioButton b;
    public RadioButton c;
    public RadioButton d;
    public RadioButton e;


    public MarkAttendance_info singlestudent;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);

        tvName = (TextView) itemLayoutView.findViewById(R.id.txt_student_name);

        tvEmailId = (TextView) itemLayoutView.findViewById(R.id.txt_student_id);
        stupkey =(TextView) itemLayoutView.findViewById(R.id.student_primkey);

        grades = (RadioGroup) itemLayoutView.findViewById(R.id.radioGroup_grade);

        a =(RadioButton) itemLayoutView.findViewById(R.id.radioButton_A);
        b =(RadioButton) itemLayoutView.findViewById(R.id.radioButton_B);
        c =(RadioButton) itemLayoutView.findViewById(R.id.radioButton_C);
        d =(RadioButton) itemLayoutView.findViewById(R.id.radioButton_D);
        e =(RadioButton) itemLayoutView.findViewById(R.id.radioButton_E);

        chkSelected = (CheckBox) itemLayoutView
                .findViewById(R.id.radioButtonPresent);

    }

}

// method to access in activity after updating selection
public List<MarkAttendance_info> getStudentLists() {
    return stList;
}

}

【问题讨论】:

  • 您确定所有这些代码都与您的问题相关吗?请尝试将其减少为minimal, complete, and verifiable example,以避免浪费人们阅读不相关的代码行的时间。这样做甚至可以帮助您回答自己的问题。
  • 只是因为你没有在onBindViewHolder中设置setVisibility。

标签: android android-recyclerview swap radio-group


【解决方案1】:
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {

        final int pos = position;

        viewHolder.tvName.setText(stList.get(position).getStudentname());

        viewHolder.tvEmailId.setText(stList.get(position).getStudentid());

        viewHolder.stupkey.setText(stList.get(position).getStudentPkey());

        viewHolder.chkSelected.setChecked(stList.get(position).isSelected());

        viewHolder.chkSelected.setTag(stList.get(position));

        viewHolder.chkSelected.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                CheckBox cb = (CheckBox) v;
                MarkAttendance_info contact = (MarkAttendance_info) cb.getTag();

                contact.setSelected(cb.isChecked());
                stList.get(pos).setSelected(cb.isChecked());

                if(cb.isChecked())
                {
                    viewHolder.grades.setVisibility(View.VISIBLE);
                }
                else
                {
                    viewHolder.grades.setVisibility(View.GONE);
                }



                Toast.makeText(
                        v.getContext(),
                        "Clicked on Checkbox: " + cb.getText() + " is "
                                + cb.isChecked(), Toast.LENGTH_LONG).show();
            }
        });

        viewHolder.grades.setTag(stList.get(position));
       if (chkSelected.isChecked()) {
            viewHolder.grades.setVisibility(View.VISIBLE);
        } else {
            viewHolder.grades.setVisibility(View.GONE);
        }
//            ...
    }

【讨论】:

  • 以及为什么单选按钮的值会交换位置?
  • 我不确定你在问什么。当视图滚动对你不可见时,它就会被破坏。当你回滚时,它会被重新创建。当你重新创建它时,你应该设置它的状态。
【解决方案2】:

将此行添加到onBindViewHolder

if(stList.get(position).isSelected()) {
    //hide the layout you need - i.e. set the WHOLE layout View.GONE
}

【讨论】:

  • 单选按钮的值没有交换。唯一的问题是单选组。有没有像我们为其他人做的那样为无线电组设置什么
  • 也将标签设置为 RadioGroup
  • 当我点击复选框时,问题是可见的和不可见的正在交换..如何解决它..
  • 我不懂你。你怎么能看到无形的交换?可以拍视频吗?
  • 认为 recyclerview 中有 10 个单元格。每个单元格都有一个复选框和 5 个单选按钮。最初复选框将为真,因此所有单选按钮都将可见。现在如果我取消选中一个复选框并向下滚动其他单元格单选按钮也将不可见..你知道吗?
【解决方案3】:

只需放入您的 getView() viewHolder.grades.setVisibility(cb.isChecked() ? View.VISIBLE : View.GONE);

【讨论】:

  • 我在这里得到的值很好..当我取消选中复选框时,radiogroup 将不可见,这正在工作..但是当我向下滚动时,radiogroup 对于其他人也将不可见
  • radiobutton 没有交换它的位置.. 只交换东西的 radiogroup。整个组本身交换..
  • 它不是可见的问题.. 当我点击复选框时可见和不可见正在交换..
  • 可以录制成视频吗?
  • 认为 recyclerview 中有 10 个单元格。每个单元格都有一个复选框和 5 个单选按钮。最初复选框将为真,因此所有单选按钮都将可见。现在如果我取消选中一个复选框并向下滚动其他单元格单选按钮也将不可见..你知道吗?
猜你喜欢
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多