Android Java中SearchView显示正确但点击返回错误位置的解决
问题修复方案
问题根源
你这问题出在RecyclerView的点击事件逻辑上,和SearchView本身没关系。大概率是处理点击时,你直接用了原始列表listOfMovies的位置去拿数据,而不是用Adapter当前持有的过滤后列表mMovies的位置。
修复步骤
不用重写SearchView的点击事件,只需要调整Adapter的点击处理逻辑就行:
让点击事件绑定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); // 这里写点击后的逻辑,比如跳详情页 } }如果用接口回调传数据,直接传对象而非位置
要是你在Fragment里通过接口回调处理点击,别传位置再去原始列表取,直接把过滤后的对象传过去。比如:// 在MovieAdapter里定义回调接口 public interface OnMovieClickListener { void onMovieClick(MovieResult movie); } // 初始化Adapter的时候设置回调 mAdapter = new MovieAdapter(new OnMovieClickListener() { @Override public void onMovieClick(MovieResult movie) { // 直接拿到正确的过滤后数据,处理逻辑就行 } });优化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Ü
相关产品推荐
相关产品推荐

