RecyclerView中声明ImageView报错:无法解析findViewById方法
RecyclerView中findViewById无法解析的问题解决
嘿,这个问题其实挺典型的,我来给你拆解一下:
为什么会报错?
findViewById() 是View或者Activity类的专属方法,你的 RecyclerViewAdapter 既不是View的子类,也不是Activity的子类,所以直接在Adapter里调用这个方法,编译器肯定找不到它呀!而且还有个隐藏问题:你每次在onBindViewHolder里去查找ImageView,会重复执行视图查找操作,严重影响RecyclerView的复用性能,这也违背了ViewHolder设计的初衷。
正确的做法:把ImageView放到ViewHolder里缓存
RecyclerView的ViewHolder就是用来缓存列表项里的所有视图控件的,咱们应该把ImageView的实例化操作放到ViewHolder的构造函数里,之后直接通过ViewHolder对象来操作它就行。
修改后的完整代码示例
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<Requete> items; private int itemLayout; public RecyclerViewAdapter(List<Requete> items, int itemLayout) { this.items = items; this.itemLayout = itemLayout; } public void update(List<Requete> nimp) { items.clear(); items.addAll(nimp); notifyDataSetChanged(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Requete item = items.get(position); ViewHolder vh = (ViewHolder)holder; // 注意:你原代码里两次给primaryText设置文本,会导致第一次的内容被覆盖,建议检查业务逻辑 vh.primaryText.setText(Integer.toString(item.getState())); vh.primaryText.setText(item.getserviceName()); vh.data = item; // 现在直接通过ViewHolder操作ImageView,比如根据item状态控制显示 // vh.green.setVisibility(View.VISIBLE); } @Override public int getItemCount() { return items.size(); } public static class ViewHolder extends SwipeToAction.ViewHolder<Requete>{ public TextView primaryText; public ImageView green; // 添加ImageView成员变量 public ViewHolder(View itemView) { super(itemView); primaryText = (TextView) itemView.findViewById(R.id.titleItem); green = (ImageView) itemView.findViewById(R.id.statecolorG); // 在这里实例化ImageView } } }
关键要点总结
- 所有列表项里的控件都应该在ViewHolder的构造函数中完成查找,这样每个列表项只会查找一次,复用的时候直接拿缓存的实例
- Adapter本身不能直接调用
findViewById(),必须通过具体的View实例(比如ViewHolder里的itemView)来调用这个方法 - 你原代码里两次给
primaryText设置文本的逻辑有问题,第二次的内容会完全覆盖第一次的,建议根据实际需求调整
内容的提问来源于stack exchange,提问作者Victor Attila Breelle
相关产品推荐
相关产品推荐

