Я использую recyclerview с флажком и поисковым фильтром.Хорошее начало, когда я ищу, используя фильтр на recyclerview.например, у меня есть 3 пункта в представлении переработчика (A, B, C).в первый раз я проверяю элемент A, а затем я ищу элемент B и проверяю элемент B, и когда я удаляю запрос в поиске и возвращаюсь к представлению recycler (с помощью notifydatasetchanged () для обновления представления recycler), в этом нет ничего плохого
проверено
но когда я снимаю флажки с обоих пунктов (элементы A и B), а затем я ищу элемент c и проверяю элемент c, ПЕРВЫЙ ПУНКТ ПРОВЕРЕН (здесь A) всегдапроверено, но в списке проверенных списков нет элемента A
проверено, но не существует
это модель для списка в rectclerview
public class herbsModel {
private boolean isSelected;
private String idHerbs,nameHerbs;
public herbsModel(String idHerbs, String nameHerbs) {
this.idHerbs = idHerbs;
this.nameHerbs = nameHerbs;
}
public String getIdHerbs() {
return idHerbs;
}
public String getNameHerbs() {
return nameHerbs;
}
public boolean getSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}
thisэто поиск по тексту редактирования по основной активности
search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
filter(s.toString());
}
});
private void filter(String s) {
ArrayList<herbsModel> filteredlist = new ArrayList<>();
for (herbsModel item : herbsModels)
{
if(item.getNameHerbs().toLowerCase().contains(s.toLowerCase()))
{
filteredlist.add(item);
}
}
adapter.filterlist(filteredlist);
}
это как проверить отмеченные элементы
sb = new StringBuffer();
for (herbsModel h : adapter.checkedHerbs)
{
sb.append(h.getNameHerbs());
sb.append("\n");
}
if (adapter.checkedHerbs.size()>0)
{
Toast.makeText(getActivity(),sb.toString(),Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(getActivity(),"Please Check Plants",Toast.LENGTH_SHORT).show();
}
это держатель onbindview на адаптере, который использует логику, чтобы получить проверенный или непроверенный элемент и сохранитьпроверил элемент в новый массив и установил проверил элементы
@Override
public void onBindViewHolder(@NonNull final herbsPredictViewHolder herbsPredictViewHolder, int i) {
final herbsModel detailherbs = herbsModelList.get(i);
herbsPredictViewHolder.name.setText(detailherbs.getNameHerbs());
if(detailherbs.getSelected()==true)
{
herbsPredictViewHolder.checkBox.setChecked(true);
}
else{
herbsPredictViewHolder.checkBox.setChecked(false);
herbsPredictViewHolder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClick(View v, int pos) {
CheckBox checkBox = (CheckBox) v;
if (checkBox.isChecked())
{
checkedHerbs.add(herbsModelList.get(pos));
detailherbs.setSelected(true);
}
else if(!checkBox.isChecked())
{
checkedHerbs.remove(herbsModelList.get(pos));
detailherbs.setSelected(false);
}
}
});
}
}
это функция фильтра на адаптере
public void filterlist (ArrayList<herbsModel> filteredList)
{
herbsModelList =filteredList;
notifyDataSetChanged();
}
Проблема в запуске после проверки чего-либо из searchview изатем при обновлении в режиме повторного просмотра все мои непроверенные элементы становятся отмеченными, даже если в списке массивов selecteditems это значение равно нулю.Если я не использую поиск, он работает нормально