You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android RecyclerView筛选后点击跳转错误问题求助

解决RecyclerView筛选后点击跳转错误的问题

嘿,这个问题我见得太多了,本质上就是你搞混了原列表和筛选后的列表的索引对应关系!

你现在的情况是:筛选后RecyclerView显示的是过滤后的条目,但点击时还是用当前的position去原列表里取数据,自然会跳转到原列表对应位置的Activity,而不是你看到的筛选条目对应的页面。下面是具体的解决步骤:

1. 维护两个数据集

首先,你需要在代码里同时保留两个列表:

  • 一个是完整的原始数据列表(比如originalList),用来存储所有初始数据,永远不修改它;
  • 另一个是筛选后的列表(比如filteredList),用来存储当前显示的过滤结果,筛选操作只更新这个列表。
// 全局变量
private List<YourModel> originalList = new ArrayList<>();
private List<YourModel> filteredList = new ArrayList<>();
private YourAdapter adapter;

2. 适配器绑定筛选后的列表

确保你的RecyclerView适配器是基于filteredList来构建UI的:

  • getItemCount()返回filteredList.size();
  • onBindViewHolder()里从filteredList中获取当前位置的数据。

示例适配器代码:

public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {
    private List<YourModel> mList;

    public YourAdapter(List<YourModel> list) {
        this.mList = list;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        YourModel item = mList.get(position);
        // 绑定数据到CardView的控件上,比如holder.title.setText(item.getName());
    }

    // ViewHolder里设置点击监听
    class ViewHolder extends RecyclerView.ViewHolder {
        TextView title;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.tv_title);
            // 给整个条目设置点击事件
            itemView.setOnClickListener(v -> {
                // 关键!从当前绑定的列表(也就是filteredList)里获取点击的item
                YourModel clickedItem = mList.get(getAdapterPosition());
                // 用clickedItem里的信息跳转Activity,比如根据类型或者ID
                Intent intent = new Intent(v.getContext(), TargetActivity.class);
                intent.putExtra("ITEM_DATA", clickedItem);
                v.getContext().startActivity(intent);
            });
        }
    }
}

3. 正确实现筛选逻辑

当你进行筛选(比如搜索输入)时,要基于originalList生成新的filteredList,然后通知适配器更新:

// 假设这是搜索框的文本变化监听
searchView.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        String query = s.toString().trim();
        filteredList.clear();
        if (query.isEmpty()) {
            // 为空时显示全部数据
            filteredList.addAll(originalList);
        } else {
            // 筛选包含关键词的条目
            for (YourModel item : originalList) {
                if (item.getName().contains(query)) {
                    filteredList.add(item);
                }
            }
        }
        // 通知适配器更新UI
        adapter.notifyDataSetChanged();
    }

    @Override
    public void afterTextChanged(Editable s) {}
});

关键注意点

  • 绝对不要在点击事件里用position去originalList里取数据!一定要从适配器绑定的filteredList中获取;
  • 不要直接修改originalList,始终用它作为筛选的数据源;
  • 点击事件里推荐用getAdapterPosition()而不是ViewHolder构造器里的position变量,避免RecyclerView复用导致的位置错误。

按照这个逻辑修改后,筛选后的条目点击就会跳转到对应的关联Activity了!

内容的提问来源于stack exchange,提问作者Albert Richstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:20:46