Как обновить Android RecyclerView элементы после фильтра поиска? - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь отфильтровать RecyclerView с помощью класса Android Filterable.

Я следовал этому руководству Android RecyclerView, добавив поисковый фильтр , чтобы выполнить эту задачу.

Проект выполняется без ошибок, я отобразил массив результатов в журнале и получаю правильные результаты , но ничего не меняется в UI.

Вот мой код адаптера:

  public class CoffretPicturesAdapter extends RecyclerView.Adapter<CoffretPicturesAdapter.MyViewHolder> implements Filterable {

private Context mContext ;
private ArrayList<Picture> mData ;
private ArrayList<Picture> mDataFiltered;

public CoffretPicturesAdapter(Context mContext, ArrayList<Picture> mData) {
    this.mContext = mContext;
    this.mData = mData;
    this.mDataFiltered = mData;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view ;
    LayoutInflater mInflater = LayoutInflater.from(mContext);
    view = mInflater.inflate(R.layout.cardview_item_coffret,parent,false);
    return new MyViewHolder(view);
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                mDataFiltered = mData;
            } else {
                ArrayList<Picture> filteredList = new ArrayList<>();
                for (Picture row : mData) {

                    // name match condition. this might differ depending on your requirement
                    // here we are looking for name or phone number match
                    if (row.getTitle().toLowerCase().contains(charString.toLowerCase())) {
                        filteredList.add(row);
                    }
                }

                mDataFiltered = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = mDataFiltered;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            mDataFiltered = (ArrayList<Picture>) filterResults.values;
            notifyDataSetChanged();
        }
    };
}

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    holder.coffret_title.setText(mData.get(position).getTitle());
    Picasso.with(mContext).load(mData.get(position).getUri()).placeholder(R.drawable.placeholder).resize(500,500).centerCrop().into(holder.coffret_thumbnail);
    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext, "" + mData.get(position).getTitle(), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(mContext, SelectedPicPreviewActivity.class);
            intent.putExtra("image_url", mData.get(position).getUri().toString());
            mContext.startActivity(intent);

        }
    });
}

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

public static class MyViewHolder extends RecyclerView.ViewHolder {

    TextView coffret_title;
    ImageView coffret_thumbnail;
    LinearLayout cardView ;

    public MyViewHolder(View itemView) {
        super(itemView);

        coffret_title = (TextView) itemView.findViewById(R.id.coffret_title_id) ;
        coffret_thumbnail = (ImageView) itemView.findViewById(R.id.coffret_img_id);
        cardView = (LinearLayout) itemView.findViewById(R.id.cardview_id);

    }
}

}

Вот функция для получения данных из моего внешнего хранилища

  private ArrayList<Picture> getData() {
    ArrayList<Picture> results= new ArrayList<>();
    //TARGET FOLDER
    File picsFolder = new File(Environment.getExternalStorageDirectory() + "/coffretPics");

    Picture s;

    if (picsFolder.exists()) {
        //GET ALL FILES IN DOWNLOAD FOLDER
        File[] files = picsFolder.listFiles();

        //LOOP THRU THOSE FILES GETTING NAME AND URI
        for (int i = files.length - 1; i >= 0; i--) {
            File file = files[i];

            s = new Picture();
            s.setTitle(file.getName());
            s.setUri(Uri.fromFile(file));


            results.add(s);
        }
    }

    return results;
}

А это функция для прослушивания изменений ввода текста

   @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));
    searchView.setMaxWidth(Integer.MAX_VALUE);

    // listening to search query text change
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // filter recycler view when query submitted
            adapter.getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            // filter recycler view when text is changed
            adapter.getFilter().filter(query);
            return false;
        }
    });
    return true;
}

Надеюсь, вы, ребята, поможете мне решить эту проблему.

1 Ответ

1 голос
/ 18 марта 2019

Ваш просмотрщик не работает с отфильтрованными данными.
После завершения фильтрации и вызова notifyDataSetChanged(); он фактически связывает все видимые представления с новым содержимым с помощью метода onBindViewHolder.
Вы можете видеть, что в onBindViewHolder вы получаете предмет от mData, когда вы должны получить его от mDataFiltered.

...