Android RecyclerView Checkbox随机检查

时间:2015-12-12 01:11:57

标签: android checkbox android-recyclerview

我有一个recyclerview,可以在cardviews上加载复选框。这是适配器。它加载时很好。但是当我故意检查recyclerview上的某个项目时,会随机选中一个复选框。我该如何摆脱这个问题?这是我的适配器。提前谢谢。

<?php
$arrMessage = str_split(stripcslashes("adriano asdasd"));
$arrTemp = array();
$line = 0;
$word = array();
$arrTemp[$line] = array();

foreach($arrMessage as $char) {

    if($char == " ") {
        //calculate numbers of chars currently on line + number of chars in word
        $numTotalChars = count($word) + count($arrTemp[$line]);
        //if total > 20 chars on a line, create new line
        if($numTotalChars > 20) {
            $line++;
            $arrTemp[$line] = array();
        }
        $word[] = $char;
        //push word-array onto line + empty word array
        $arrTemp[$line] = array_merge($arrTemp[$line], $word);
        $word = array();
    } else {
        //if word is too long for a line, split it
        if( count($word) > 20) {
            $numTotalChars = count($word) + count($arrTemp[$line]);

            if($numTotalChars > 20) {
                $line++;
                $arrTemp[$line] = array();
            }

            $arrTemp[$line] = array_merge($arrTemp[$line], $word);
            $word = array();
        }
        $word[] = $char;
    }
}
// Add last word if there's something left over
if (count($word)) {
    $numTotalChars = count($word) + count($arrTemp[$line]);
    if ($numTotalChars > 20) {
        $line++;
        $arrTemp[$line] = array();
    }
    //push word-array onto line + empty word array
    $arrTemp[$line] = array_merge($arrTemp[$line], $word);
}
var_dump($arrTemp);

}

4 个答案:

答案 0 :(得分:2)

你的onBindViewHolder()方法有问题...... RecyclerView将在滚动期间重用ViewHolders。因此,您应该为ViewHolder中的所有视图设置状态,以查看一致的数据。现在,您只为&#34; txtQuestionText&#34;设置文本。在这种情况下,您将看到列表项的一致文本和RadioButtons的随机状态。

简而言之,你应该有这样的事情:

@Override
public void onBindViewHolder(QuestionsViewHolder holder, final int position) {
    holder.setModel(Questions.get(position));
}

...

public class QuestionsViewHolder ...
...
public void setModel(QuestionModel model){
    rbLike.setChecked(model.like);
    rbdisLike.setChecked(model.dislike);
    rbnoComment.setChecked(model.comment);
    txtQuestionText.setText(model.text);
}

答案 1 :(得分:1)

就我而言,我有以下代码:

if (checkpoint.getIsAttendance() == 1) { 
    holder.checkBoxAttendance.setChecked(true);
}

及其发生时,复选框会随机选中。

我更改了如下代码后

if (checkpoint.getIsAttendance() == 1) { 
    holder.checkBoxAttendance.setChecked(true);
} else { 
    holder.checkBoxAttendance.setChecked(false);
}

随机选中的复选框消失了。

答案 2 :(得分:0)

if (itemChecked[position])
            holder.ck1.setChecked(true);
        else
            holder.ck1.setChecked(false);

    holder.ck1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (holder.ck1.isChecked())
                itemChecked[position] = true;
            else
                itemChecked[position] = false;
        }
    });

    return convertView;

........

@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
    // TODO Auto-generated method stub
    CheckBox cb = (CheckBox) v.findViewById(R.id.checkBox1);
    TextView tv = (TextView) v.findViewById(R.id.textView1);
    pi = (PackageInfo) arg0.getItemAtPosition(position);
    cb.performClick();
    if (cb.isChecked()) {
        checkedValue.add(tv.getText().toString());
    } else if (!cb.isChecked()) {
        checkedValue.remove(tv.getText().toString());
    }
}

答案 3 :(得分:-1)

只需在您的override中添加以下adapter class方法:

我遇到了同样的问题,对我有用:

   @Override
    public int getItemViewType(int position) {
        return position;
    }