「已注销」 2022-03-03 17:51 采纳率: 100%
浏览 78
已结题

操作Android Listview时发生崩溃,限时解决将获得奖励

问题遇到的现象和发生背景

下拉一定距离后界面崩溃。 根据跟踪记录,有空指针异常,可能是加载不及时,也可能是其他原因。

问题相关代码,请勿粘贴截图

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元

  • 写回答

5条回答 默认 最新

  • wresource Android领域优质创作者 2022-03-08 17:41
    关注

    能不能考虑换成recycleview ,这个好像有处理缓存机制

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月8日
  • 已采纳回答 3月8日
  • 修改了问题 3月8日
  • 修改了问题 3月8日
  • 展开全部

悬赏问题

  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能