Управляйте тем, как представления перерабатываются в RecyclerView - PullRequest
0 голосов
/ 06 февраля 2020

Я ищу способ фильтрации моих данных в RecyclerView, при котором состояние данного представления не влияет на другое представление при применении фильтра. Практически у меня есть эта проблема: 1. Я добавляю «Martins» в свой список друзей, нажимая на кнопку «Добавить» (image msSxq.png) в списке без фильтра enter image description here

Я выполняю поиск и получаю следующее (изображение FGSwF.png): список после выполнения поискового действия enter image description here

Затем ясно, что, как Действие seraching выполнено, содержимое моего списка изменяется, а затем новые элементы занимают место старых элементов и возвращают состояние старых элементов!

Я ищу способ избежать этого. Я пытался прочитать несколько постов на похожую тему, но ничего (Пример ссылки: Как отфильтровать RecyclerView с помощью SearchView )

Спасибо за помощь!

Редактировать : 07/02/2020 - onBindViewHolder и код фильтрации

onBindViewHolder (в моем пользовательском адаптере)

@Override
public void onBindViewHolder(@NonNull final FriendAdapterViewHolder holder, int position) {
    String mUsernameString = suggestionList.get(position);
    String mModUsernameString = suggestionList.get(position) + "_@chatter";

    holder.username.setText(mUsernameString);
    holder.mod_username.setText(mModUsernameString);

}

методы фильтрации (всегда в моем адаптере)

@Override
public Filter getFilter() {
    return friendFilter;
}

private Filter friendFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        ArrayList<String> listFiltered = new ArrayList<>();

        if (fullSuggestionList != null) {
            if (constraint == null || constraint.length() == 0) {
                listFiltered.addAll(fullSuggestionList);
            } else {
                String searchTextLowerCase = constraint.toString().toLowerCase().trim();
                for (String item : fullSuggestionList) {
                    if (item.toLowerCase().contains(searchTextLowerCase)) {
                        listFiltered.add(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = listFiltered;

            return results;
        } else {
            return null;
        }

    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        if(results.values != null) {
            suggestionList.clear();
            suggestionList.addAll((ArrayList<String>) results.values);
            notifyDataSetChanged();
        }
    }
};

И, наконец, в моей деятельности, где я выполняю поисковое действие

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (adapter.getCompleteItemList() != null) {
                adapter.getFilter().filter(newText);
            }
            return false;
        }
    });

1 Ответ

0 голосов
/ 12 февраля 2020

Наконец, я попытался глубоко понять, как работает реселлер, и нашел решение, которое работает идеально. Фактически, когда мы фильтруем данные в поисковом представлении, связанном с просмотром переработчика, последнее, когда оно не является обязательным, перезапускает уже созданное представление и просто меняет его содержимое. Чтобы избежать этого, мы должны создать уникальный идентификатор для каждого созданного представления и сообщить нашему представителю повторного использования уникальные идентификаторы представления. Практически, я сделал следующие вещи:

В моей модели данных я создаю метод, который генерирует уникальный идентификатор для каждого экземпляра, создавая небольшой фрагмент, например:

public class MyDataModel {
    private long mId;
    ...//others variables here

    private long computeId(.../*some parameters if needed*/) {
        // write code here to generate your unique code
        return result;
    }

    public long getmId() {
        return this.mId;
    }

В моем адаптере затем я переопределяю метод getItemId ()

@override public long getItemId(int position) {
    return myDataList.get(position).getmId();
}

И, всегда в моем адаптере, в его конструктор добавляю следующую строку кода:

this.setHasStableIds(true);

Вот и все!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...