问题遇到的现象和发生背景
下拉一定距离后界面崩溃。 根据跟踪记录,有空指针异常,可能是加载不及时,也可能是其他原因。
问题相关代码,请勿粘贴截图
https://github.com/BAFOrangeCat/smartirrigation_client
package pers.huangtianlong.smartirrigation.adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.widget.SwitchCompat;
import java.util.List;
import pers.huangtianlong.smartirrigation.R;
import pers.huangtianlong.smartirrigation.entities.Device;
import pers.huangtianlong.smartirrigation.utils.LogUtils;
public class IrrigationAdapter extends BaseAdapter {
private final Context mContext;
private final List<Device> mDeviceList;
private final ImageView[] mImageViewCaches;
private ViewHolder viewHolder;
public IrrigationAdapter(Context context,
List<Device> deviceList) {
mContext = context;
mDeviceList = deviceList;
mImageViewCaches = new ImageView[deviceList.size()];
}
@Override
public int getCount() {
return mDeviceList.size();
}
@Override
public Object getItem(int i) {
return mDeviceList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
private int getNotNullStartFromArray(ImageView[] imageViewCaches) {
for (int i = 0; i < imageViewCaches.length; i++) {
if (imageViewCaches[i] != null) {
return i;
}
}
return 0;
}
private int getNotNullEndFromArray(ImageView[] imageViewCaches) {
for (int i = imageViewCaches.length - 1; i >= 0; i--) {
if (imageViewCaches[i] != null) {
return i;
}
}
return 0;
}
@Override
public View getView(int i,
View view,
ViewGroup viewGroup) {
LogUtils.debug("NotNullStart", String.valueOf(getNotNullStartFromArray(mImageViewCaches)));
LogUtils.debug("NotNullEnd", String.valueOf(getNotNullEndFromArray(mImageViewCaches)));
LogUtils.debug("original i", String.valueOf(i));
Device device = mDeviceList.get(i);
final int positionTemp = i;
if (view == null) {
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.item_irrigation, viewGroup, false);
viewHolder = new ViewHolder();
viewHolder.mIv_appIcon = view.findViewById(R.id.iv_appIcon);
viewHolder.mTv_farmCode = view.findViewById(R.id.tv_farmCode);
viewHolder.mTv_deviceCode = view.findViewById(R.id.tv_deviceCode);
viewHolder.mSw_isOpen = view.findViewById(R.id.sw_isOpen);
//保存当前的图标对象到缓存数组中
mImageViewCaches[positionTemp] = viewHolder.mIv_appIcon;
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.mTv_farmCode.setText(device.getFarmCode());
viewHolder.mTv_deviceCode.setText(device.getDeviceCode());
boolean isOpen = device.isOpen();
viewHolder.mSw_isOpen.setChecked(isOpen);
viewHolder.mIv_appIcon.setImageResource(isOpen ? R.drawable.ic_water_red : R.drawable.ic_water_black);
viewHolder.mSw_isOpen.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
LogUtils.debug("positionTemp", String.valueOf(positionTemp));
//从缓存数组中将特定图标对象取出
mImageViewCaches[positionTemp].setImageResource(isChecked ? R.drawable.ic_water_red : R.drawable.ic_water_black);
}
});
return view;
}
private static class ViewHolder {
ImageView mIv_appIcon;
TextView mTv_farmCode;
TextView mTv_deviceCode;
SwitchCompat mSw_isOpen;
}
}
运行结果及报错内容
运行结果
2022-03-08 16:45:14.974 20191-20191/pers.huangtianlong.smartirrigation D/original i: 14
2022-03-08 16:45:14.976 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:14.976 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 14
2022-03-08 16:45:14.976 20191-20191/pers.huangtianlong.smartirrigation D/original i: 15
2022-03-08 16:45:14.978 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:14.978 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 15
2022-03-08 16:45:14.978 20191-20191/pers.huangtianlong.smartirrigation D/original i: 16
2022-03-08 16:45:14.980 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:14.980 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 16
2022-03-08 16:45:14.980 20191-20191/pers.huangtianlong.smartirrigation D/original i: 17
2022-03-08 16:45:18.255 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:18.255 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 17
2022-03-08 16:45:18.255 20191-20191/pers.huangtianlong.smartirrigation D/original i: 18
2022-03-08 16:45:18.272 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:18.272 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 18
2022-03-08 16:45:18.272 20191-20191/pers.huangtianlong.smartirrigation D/original i: 19
2022-03-08 16:45:18.289 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:18.289 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 19
2022-03-08 16:45:18.289 20191-20191/pers.huangtianlong.smartirrigation D/original i: 20
2022-03-08 16:45:18.306 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:18.306 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 19
2022-03-08 16:45:18.306 20191-20191/pers.huangtianlong.smartirrigation D/original i: 21
2022-03-08 16:45:18.322 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:18.322 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 21
2022-03-08 16:45:18.322 20191-20191/pers.huangtianlong.smartirrigation D/original i: 22
2022-03-08 16:45:18.355 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:18.355 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 21
2022-03-08 16:45:18.355 20191-20191/pers.huangtianlong.smartirrigation D/original i: 23
2022-03-08 16:45:18.423 20191-20191/pers.huangtianlong.smartirrigation D/NotNullStart: 0
2022-03-08 16:45:18.423 20191-20191/pers.huangtianlong.smartirrigation D/NotNullEnd: 21
报错内容
2022-03-08 16:43:39.489 20047-20047/pers.huangtianlong.smartirrigation E/AndroidRuntime: FATAL EXCEPTION: main
Process: pers.huangtianlong.smartirrigation, PID: 20047
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
at pers.huangtianlong.smartirrigation.adapters.IrrigationAdapter$1.onCheckedChanged(IrrigationAdapter.java:100)
at android.widget.CompoundButton.setChecked(CompoundButton.java:156)
at androidx.appcompat.widget.SwitchCompat.setChecked(SwitchCompat.java:1162)
at pers.huangtianlong.smartirrigation.adapters.IrrigationAdapter.getView(IrrigationAdapter.java:92)
我的解答思路和尝试过的方法
创建一个数组来缓存已经出现的图像。当Switch状态发生变化时,获取缓存并修改其图像文件
尝试实现自定义接口,结果还是一样
我试过不修改图像,而是尝试修改farmCode显示框的内容,效果基本一样,都崩溃
更新
Log打印缓存数组不为空的开始,与不为空的结束,发现这之间的长度始终为当前Listview条目的当前可见数量
我想要达到的结果
修改任意一个Switch按钮的状态时,可以修改同一个条目的图像
4天内解决问题奖励20元,5-8天内解决问题奖励10元