Searchview не работает должным образом со скрытыми элементами recyclerview

#android #android-recyclerview #searchview

#Android #android-recyclerview #searchview

Вопрос:

В моем приложении есть адаптер данных со скрытыми элементами recyclerview. Я создал функцию фильтра для поиска значений в списке. Первый поиск всегда показывает правильные значения запроса. Но при следующем поиске не отображаются искомые значения. Я понял, что если я сверну и снова открою searchview, проблема исчезнет. Но только для второго и следующего поиска … P.S Такой ситуации не существует, если элементы recyclerview не скрыты.

Я отправляю свою OnBindViewHolder функцию из адаптера и функцию поиска из activity.

 public class DataAdapter extends RecyclerView.Adapter<DataAdapter.CustomViewHolder> {

private List<ModelData> ModelList;
private List<ModelData> ListFull;
private Context mContext;
private boolean activate=false;



public DataAdapter(List<ModelData> ModelList, Context mCtx) {

    this.ModelList = ModelList;
    this.mContext = mCtx;
    ListFull = new ArrayList<>(ModelList);


public void onBindViewHolder(final CustomViewHolder holder, int position) {

    final ModelData result = ModelList.get(position);

    holder.status.setText(result.getStatus());
    if(holder.status.getText().equals("YYY")amp;amp; !activate){

        holder.itemView.setVisibility(View.GONE);
        holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
    }
    if(holder.status.getText().equals("YYY") amp;amp; activate){
        holder.itemView.setVisibility(View.VISIBLE);
        holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    }



}



@Override
public int getItemCount() {
    return ModelList.size();
}

public Filter getFilter() {
    return exampleFilter;
}


private Filter exampleFilter= new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<ModelData> filteredList= new ArrayList<>();

        if(constraint== null || constraint.length()==0){
            filteredList.addAll(ListFull);

        }else{

            String filePattern= constraint.toString().toLowerCase().trim();
            for(ModelData ModelData: ListFull){
                if(ModelData.getEventLabel().toLowerCase().contains(filePattern)){
                    filteredList.add(ModelData);
                }
            }
        }
        FilterResults filterResults= new FilterResults();
        filterResults.values= filteredList;

        return filterResults;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        ModelList.clear();
        ModelList.addAll((List)results.values);
        notifyDataSetChanged();
    }
};
 

}

Активность

  @Override
public void onCreateOptionsMenu(@NonNull final Menu menu, MenuInflater inflater) {

    inflater.inflate(R.menu.menuLayout, menu);

    this.menu = menu;
    final MenuItem searchItem = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) searchItem.getActionView();


    searchView.setQueryHint("type something");
    searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {

            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            biezaceAwarieAdapter.getFilter().filter(newText);
            ImageView searchViewIcon = searchView.findViewById(R.id.search_close_btn);
            searchViewIcon.setVisibility(View.GONE);

            return false;
        }

    });

    super.onCreateOptionsMenu(menu, inflater);
}
 

Ответ №1:

Сделайте это:

           public class DataAdapter extends RecyclerView.Adapter<DataAdapter.CustomViewHolder>  implements Filterable{
 

Измените свой для каждого цикла:

   for(ModelData ModelData: ListFull)
 

Для

    for(ModelData modeldata: ListFull)
 

Новый код должен быть:

       String filePattern= constraint.toString().toLowerCase().trim();
        for(ModelData modeldata: ListFull){
            if(modeldata.getEventLabel().toLowerCase().contains(filePattern)){
                filteredList.add(modeldata);
            }
        }
 

Комментарии:

1. Не могли бы вы рассказать мне, как это изменение может помочь?

2. Реальная проблема в том, что вы не внедрили Filterable в свой DataAdapter.

3. Проверьте мой обновленный ответ. На этот раз он будет работать в Sha Allah