刚刚开始学习 Android,请问一下下面这两行代码为什么会导致闪退?

2021-11-24 17:20:25 +08:00
 Features

编译通过,但是会闪退


public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder;
        if(view == null){
            holder = new ViewHolder();
            mView = LayoutInflater.from(context).inflate(R.layout.grid_item,viewGroup,false);
            holder.img  = (ImageView) mView.findViewById(R.id.icon_item);
            holder.title = (TextView) mView.findViewById(R.id.icon_text);
        }else{
            holder = (ViewHolder) mView.getTag();
        }

        //这两行会导致闪退
        holder.img.setImageResource(arr.get(i).getRid());
        holder.title.setText(arr.get(i).getTitle());

        Log.e("myapp","abc");

        return mView;
    }
6212 次点击
所在节点    Android
32 条回复
hello2090
2021-11-24 17:28:29 +08:00
虽然没做过 android 你这个 debug 一下不就是了
holder, holder.img 是不是空,arr 或者 arr.get(i) 是不是空
SupperMary
2021-11-24 17:30:13 +08:00
adb shell 上去,logcat -b crash 会告诉你很详细的错误原因
Features
2021-11-24 17:30:20 +08:00
@hello2090 这个确实空指针了,但是不知道什么原因导致的
集合长度为 4 ,会更新 4 次,但是集合数据是正常的
hello2090
2021-11-24 17:34:06 +08:00
@Features 很简单啊,arr 更新的时候打个 log, 运行 holder.img.setImageResource(arr.get(i).getRid()); 之前打个 log 看看呗

你这个只是读,而且还不是数值不对,而是直接 null, 应该不会是多线程的问题,
lvdb
2021-11-24 17:35:32 +08:00
if 分支结尾需要 mView.setTag(holder)一下吧?现在安卓基本上不用 listview 了,基本上都是 recyclerview 来处理了。可以直接学 recyclerview
xFrye
2021-11-24 17:36:08 +08:00
ListView? 有想过通过 getTag 获取到的 holder 是从哪里来的么? viewHolder 不存下来的话,怎么会拿得到呢
lvdb
2021-11-24 17:38:30 +08:00
@xFrye 哈哈初学者,可能还不是太明白这个 item 复用吧
xFrye
2021-11-24 17:57:29 +08:00
@lvdb 应该是的,不过写的时候还是要多思考一下。

https://juejin.cn/post/6844903911225032712 楼主可以看看这个梳理下,不过现在基本上确实 recyclerview 用的比较多了
busymilk
2021-11-24 18:03:59 +08:00
你没有 setTag. getTag 当然是空
xuhaoyangx
2021-11-24 18:05:29 +08:00
现在就别用 listview 了
Features
2021-11-24 18:05:58 +08:00
@xFrye 是 GridView,ListView 写了就没问题😂
Features
2021-11-24 18:06:31 +08:00
@xuhaoyangx 只是当预热了解
sankemao
2021-11-24 18:13:34 +08:00
没有 setTag,当然 get 不到,而且下面你的写法,失去了复用机制
youxiachai
2021-11-24 18:14:12 +08:00
这代码...不是我 10 年前的写法吗....

现在用 RV 用不着这样写了啊...
youxiachai
2021-11-24 18:15:21 +08:00
不对...按道理,现在基本 RV 一把梭.... lz 用的什么入门资料..怎么还有这么远古的用法
Features
2021-11-24 18:15:25 +08:00
@xFrye 确实是要先 setTag ,但是我之前写了一个 demo ,是 ListView 的,没有 setTag 却可以😭
Features
2021-11-24 18:15:59 +08:00
@lvdb 是的是的,谢谢
Features
2021-11-24 18:16:44 +08:00
@youxiachai 就是菜鸟教程,哈哈,没事,反正先了解下,应该都没问题吧
Features
2021-11-24 18:17:39 +08:00
@sankemao 好奇怪欸,我用 ListView 的时候,不用 setTag 也能跑起来,用 GridView 的时候却报错了
youxiachai
2021-11-24 18:19:49 +08:00
@Features 现在有 google 的 codelab 那么好的教程....完全搞不懂现在的年轻人,怎么去看采集网站的教程..

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817703

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX