为ListView子项CardView中的ImageView设置OnClickListener遇空指针问题
出现java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference,大概率是没正确获取到ImageView实例,常见原因和解决方法如下:
错误地从主Activity布局查找ImageView
ImageView属于子项布局,并非主Activity的ListView所在布局。必须在Adapter的getView方法中,通过子项布局的根View调用findViewById,不能直接用getActivity().findViewById或context.findViewById。ImageView的ID拼写错误
检查子项布局XML里ImageView的android:id,和代码中findViewById传入的ID是否完全一致,拼写差池会直接导致返回null。ViewHolder模式下未正确初始化ImageView
如果用了ViewHolder优化,创建ViewHolder时必须从inflated的子项View中获取ImageView并赋值给ViewHolder成员变量,漏写这一步会导致复用convertView时,ViewHolder里的ImageView仍为null。
给你一个标准的正确写法示例:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { // 加载子项布局文件,注意是你定义的子项布局,不是主布局 convertView = LayoutInflater.from(mContext).inflate(R.layout.your_item_layout, parent, false); holder = new ViewHolder(); // 必须通过convertView(子项根View)查找ImageView holder.itemImg = convertView.findViewById(R.id.your_image_view_id); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 给ImageView设置点击事件 holder.itemImg.setOnClickListener(v -> { // 这里写你的点击逻辑,比如获取当前项数据 YourData data = mDataList.get(position); // do something }); // 其他数据填充操作 return convertView; } static class ViewHolder { ImageView itemImg; }
另外注意:ListView的子项是动态复用的,不要在getView方法外尝试获取子项里的ImageView,只有在getView中才能拿到当前position对应的有效子项View实例。
内容的提问来源于stack exchange,提问作者Rio

