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

Android Java中SearchView显示正确但点击返回错误位置的解决

问题修复方案

问题根源

你这问题出在RecyclerView的点击事件逻辑上,和SearchView本身没关系。大概率是处理点击时,你直接用了原始列表listOfMovies的位置去拿数据,而不是用Adapter当前持有的过滤后列表mMovies的位置。

修复步骤

不用重写SearchView的点击事件,只需要调整Adapter的点击处理逻辑就行:

  1. 让点击事件绑定Adapter内部的过滤后列表
    在Adapter的ViewHolder里设置点击监听时,从Adapter自己的mMovies列表里取对应位置的数据,别碰外部的原始列表。示例代码:

    class MovieViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public MovieViewHolder(View itemView) {
            super(itemView);
            // 绑定你的视图控件...
            itemView.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            int position = getAdapterPosition();
            // 从当前Adapter的过滤后列表里拿数据
            MovieResult clickedMovie = mMovies.get(position);
            // 这里写点击后的逻辑,比如跳详情页
        }
    }
    
  2. 如果用接口回调传数据,直接传对象而非位置
    要是你在Fragment里通过接口回调处理点击,别传位置再去原始列表取,直接把过滤后的对象传过去。比如:

    // 在MovieAdapter里定义回调接口
    public interface OnMovieClickListener {
        void onMovieClick(MovieResult movie);
    }
    
    // 初始化Adapter的时候设置回调
    mAdapter = new MovieAdapter(new OnMovieClickListener() {
        @Override
        public void onMovieClick(MovieResult movie) {
            // 直接拿到正确的过滤后数据,处理逻辑就行
        }
    });
    
  3. 优化Adapter的filterList方法
    确保Adapter的数据源被正确替换,用addAll比直接赋值更安全,避免引用混乱:

    @SuppressLint("NotifyDataSetChanged")
    public void filterList(ArrayList<MovieResult> filterlist) {
        mMovies.clear();
        mMovies.addAll(filterlist);
        notifyDataSetChanged();
    }
    

核心注意点

  • RecyclerView的视图渲染、点击事件必须完全依赖Adapter内部持有的数据源,绝对不能直接用外部的原始列表。
  • getAdapterPosition()返回的是当前显示列表(过滤后)的位置,必须对应Adapter里的mMovies列表。

内容的提问来源于stack exchange,提问作者YUSUF EKREM ÜNLÜ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:37:13