如何在RecyclerView中点击指定位置图片时切换为新图片?
问题描述
我有一个基于图片ArrayList的RecyclerView,目前可以正常运行,效果如下:
现在我希望点击任意图片时,在RecyclerView适配器实现的itemClicked方法中将该图片切换为目标图片,相关代码如下:
public List<Information> getData(){ List<Information> data = new ArrayList<>(); int[] iconList = {R.drawable.th_ok,R.drawable.thbg_small,R.drawable.thbg_small,R.drawable.thbg_small,R.drawable.thbg_small,R.drawable.thbg_small,R.drawable.thbg_small,R.drawable.thbg_small,R.drawable.thbg_small,R.drawable.thbg_small,R.drawable.thbg_small}; String[] titles = {"1","2","3","4","5","6","7","8","9","10"}; String[] subtitles = {"A","B","C","D","E","F","G","H","I","J" }; for(int i=0;i<titles.length && i<iconList.length;i++) { Information current = new Information(); current.iconth = iconList[i]; current.subtitle = subtitles[i]; data.add(current); } return data; } @Override public void itemClicked(View view, int position) { Resources res = getResources(); Drawable newimages = res.getDrawable(R.drawable.th_ok); // startActivity(new Intent(treasure.this,MapsActivity.class)); }
解决方案
嘿,这个需求其实很好实现,咱们一步步来搞定它:
核心思路
RecyclerView是基于数据源来渲染item的,直接设置Drawable不会持久化(滑动后会因为item复用丢失状态),正确的做法是修改对应位置的数据源,再通知适配器刷新该item。
具体步骤
- 修改对应位置的数据源
首先你需要确保持有全局可访问的数据源列表(比如在Activity/Fragment里定义List<Information> mDataList,并在初始化时赋值为getData()的返回值),然后在itemClicked方法中修改对应position的图片资源ID:
// 修改数据源中对应位置的图片资源ID mDataList.get(position).iconth = R.drawable.th_ok;
- 通知适配器刷新单个item
改完数据源后,调用适配器的notifyItemChanged()方法,只刷新点击的那个item(比全量刷新更高效):
// 假设mAdapter是你初始化的RecyclerView适配器实例 mAdapter.notifyItemChanged(position);
修改后的完整itemClicked方法示例
// 确保mDataList和mAdapter是全局可访问的变量 @Override public void itemClicked(View view, int position) { // 修改数据源中对应位置的图片ID mDataList.get(position).iconth = R.drawable.th_ok; // 通知适配器刷新该item mAdapter.notifyItemChanged(position); }
额外注意点
- 要保证你的
Information类的iconth字段不是final修饰的,否则无法修改它的值; - 不要直接用
newimages这个Drawable对象去设置图片,因为RecyclerView的item复用机制会导致状态丢失,必须通过修改数据源来实现持久化的状态变更。
内容的提问来源于stack exchange,提问作者mas bro
相关产品推荐
相关产品推荐

