在RecyclerView中实现过滤时,由于基础数据集的过滤,两个数据列表(即过滤后的数据列表和原本的数据列表)都会删除相应的项,而不仅是过滤后的数据列表。
要解决这个问题,需要使用两个列表:一个保存所有原始数据项,一个保存当前过滤后的数据项,同时将过滤逻辑中涉及到的列表项都改为操作过滤后的列表项。
下面是示例代码,可以在RecyclerView Adapter中使用:
public class MyAdapter extends RecyclerView.Adapter {
private List dataList;//存储原始数据列表
private List filteredDataList;//存储过滤后的数据列表
private OnItemClickListener listener;
public MyAdapter(List dataList, OnItemClickListener listener) {
this.dataList = dataList;
this.filteredDataList = dataList;
this.listener = listener;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
String data = filteredDataList.get(position);
holder.textView.setText(data);
}
@Override
public int getItemCount() {
return filteredDataList.size();
}
public void filter(String query) {
List tempList = new ArrayList<>();
for (String data : dataList) {
if (data.toLowerCase().contains(query.toLowerCase())) {
tempList.add(data);
}
}
filteredDataList = tempList;
notifyDataSetChanged();
}
public interface OnItemClickListener {
void onItemClick(String itemData);
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
listener.onItemClick