Я знаю, что в классе 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);
}
}
});
}
Пробуя этот код, я получил ожидаемый вывод, но совсем нет.
Я объясню это с помощью изображений.
По умолчанию первый элемент выбран из моего адаптера
Затем я пытаюсь выбрать 2-й, а затем 3-й, а затем 4-й и, наконец, 5-й,
Здесь должен быть выбран только 5-й, но все пять выбираются.
Если я прокручиву список до дна и снова зайду,
Я получил то, что ожидал,
Как я могу преодолеть эту проблему? И иногда, если я прокручиваю список очень быстро, выбирается какой-то другой элемент. Как преодолеть эту проблему тоже?
Обновить
Пока я пытаюсь использовать notifyDataSetChanged()
после fonts.get(position).setSelected(isChecked);
Я получил следующее исключение,
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)