我知道在 RecyclerView
类中没有默认的选择方法,但是我尝试了以下方法:
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.mTextView.setText(fonts.get(position).getName());
holder.checkBox.setChecked(fonts.get(position).isSelected());
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked) {
for (int i = 0; i < fonts.size(); i++) {
fonts.get(i).setSelected(false);
}
fonts.get(position).setSelected(isChecked);
}
}
});
}
在尝试这段代码时,我得到了预期的输出,但并非完全如此。
我会用图片来解释。
默认情况下,从适配器中选择第一项。
然后我选择第二个,然后第三个,然后第四个,最后第五个。
这里只有第五个应该被选中,但是所有五个都被选中了。
如果我将列表滚动到底部,然后再次回到顶部,就会得到我所期望的结果。
我怎样才能克服这个问题?有时候,如果我快速滚动列表,其他一些项目会被选中。我怎样才能克服这个问题呢?
当我尝试在 fonts.get(position).setSelected(isChecked);
之后使用 notifyDataSetChanged()
时,我得到了下面的例外:
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:1462)
at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:2982)
at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:7493)
at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:4338)
at com.app.myapp.screens.RecycleAdapter.onRowSelect(RecycleAdapter.java:111)