gpt4 book ai didi

java - 如何在搜索过滤器后更新 android RecyclerView 项目?

转载 作者:行者123 更新时间:2023-12-02 10:07:40 25 4
gpt4 key购买 nike

我正在尝试使用 Android Filterable 类过滤 RecyclerView

我已按照本教程 Android RecyclerView adding Search Filter 进行操作完成这项任务。

项目运行没有错误,我在日志中显示了结果数组,并且得到了正确的结果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;
}

希望大家能帮我解决这个问题。

最佳答案

您的回收 View 无法处理过滤后的数据。
当您完成过滤并调用 notifyDataSetChanged(); 时,它实际上使用 onBindViewHolder 方法将所有可见 View 与新内容绑定(bind)。
您可以看到,在 onBindViewHolder 中,您正在从 mData 获取该项目,而您应该从 mDataFiltered 获取该项目。

关于java - 如何在搜索过滤器后更新 android RecyclerView 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55225697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com