如何为水平RecyclerView选中项设置Alpha值(点击事件未在ViewHolder中实现)
解决RecyclerView点击项设置Alpha的问题
这个问题我之前也碰到过,核心原因是你获取ImageView的方式不对,导致不管点哪一项,都只能修改第一个item里的控件。下面给你两种解决方案,从快速修复到更规范的实现:
一、快速修复:在点击事件中获取当前item的ImageView
你当前用findViewById(R.id.ivPreview)是在整个Activity布局中查找控件,自然只能找到第一个匹配的ImageView(也就是RecyclerView的第一项)。正确的做法是利用点击事件传入的view参数——这个view就是你点击的那个item的根布局,通过它来查找当前项里的ImageView:
public void onItemClick(View view, int position) { // 从点击的item根布局中获取对应的ImageView ImageView ivPreview = view.findViewById(R.id.ivPreview); ivPreview.setAlpha(1f); // 别忘了把之前选中的项恢复为0.5f,否则所有点击过的项都会保持1f // 这里需要你额外记录之前选中的View,比如用一个全局变量mLastSelectedIv if (mLastSelectedIv != null) { mLastSelectedIv.setAlpha(0.5f); } mLastSelectedIv = ivPreview; // 你的其他业务代码 url_abs_fileName = adapter_hgv_preview.getItem(position); vp_adapter = new ViewPagerAdapter_Catalogue(this, strArr_MainImage); vp.setAdapter(vp_adapter); vp.setCurrentItem(position); }
不过这个方法有个小问题:当RecyclerView滑动时,因为item复用,之前选中的项可能会因为被复用而错误地显示1f的alpha,所以更推荐下面的规范做法。
二、规范实现:让Adapter维护选中状态
RecyclerView的item是复用机制,把选中状态交给Adapter维护是更可靠的方式,具体步骤如下:
1. 在Adapter中添加选中状态变量和更新方法
public class YourRecyclerViewAdapter extends RecyclerView.Adapter<YourRecyclerViewAdapter.ViewHolder> { private int mSelectedPosition = -1; // 初始值设为-1,表示没有选中项 // 更新选中位置的方法 public void setSelectedPosition(int position) { int oldSelectedPos = mSelectedPosition; mSelectedPosition = position; // 通知旧选中项更新UI if (oldSelectedPos != -1) { notifyItemChanged(oldSelectedPos); } // 通知新选中项更新UI notifyItemChanged(position); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // 其他绑定数据的代码... // 根据选中状态设置alpha if (position == mSelectedPosition) { holder.ivPreview.setAlpha(1f); } else { holder.ivPreview.setAlpha(0.5f); } } // ViewHolder类里要持有ImageView的引用 public static class ViewHolder extends RecyclerView.ViewHolder { ImageView ivPreview; public ViewHolder(@NonNull View itemView) { super(itemView); ivPreview = itemView.findViewById(R.id.ivPreview); } } }
2. 在Activity的点击事件中调用Adapter的更新方法
public void onItemClick(View view, int position) { // 让Adapter更新选中位置,自动处理alpha的变化 adapter_hgv_preview.setSelectedPosition(position); // 你的其他业务代码 url_abs_fileName = adapter_hgv_preview.getItem(position); vp_adapter = new ViewPagerAdapter_Catalogue(this, strArr_MainImage); vp.setAdapter(vp_adapter); vp.setCurrentItem(position); }
这种方式能完美适配RecyclerView的复用机制,不管怎么滑动,选中项的alpha都会正确显示,也不用自己手动管理之前的选中View,逻辑更清晰。
内容的提问来源于stack exchange,提问作者TwoStarII
相关产品推荐
相关产品推荐

