Первый проверенный элемент всегда проверяется при обновлении. - PullRequest
0 голосов
/ 16 февраля 2019

Я использую 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 это значение равно нулю.Если я не использую поиск, он работает нормально

1 Ответ

0 голосов
/ 16 февраля 2019
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);
}

Я думаю, вам нужно обновить это в

if (!detailherbs.getSelected())
{
    checkedHerbs.add(herbsModelList.get(pos));
    detailherbs.setSelected(true);
}
else 
{
    checkedHerbs.remove(herbsModelList.get(pos));
    detailherbs.setSelected(false);
}

и обновить ваш код else в

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);
                }

            }
        });
...