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;
}
这样写就完全OK,应该是view.getTag() 没有正确返回ViewHolder对象
mView = LayoutInflater.from(context).inflate(R.layout.grid_item,viewGroup,false);
ImageView img = (ImageView) mView.findViewById(R.id.icon_item);
TextView title = (TextView) mView.findViewById(R.id.icon_text);
img.setImageResource(arr.get(i).getRid());
title.setText(arr.get(i).getTitle());
return mView;
前面使用ListView,没有setTag,却能正常跑起来,所以我忽略了setTag这个api
ViewHolder holder = null;
if(view == null){
holder = new ViewHolder();
mView = LayoutInflater.from(context).inflate(R.layout.view_item,viewGroup,false);
holder.title = (TextView) mView.findViewById(R.id.title);
holder.desc = (TextView) mView.findViewById(R.id.desc);
holder.img = (ImageView) mView.findViewById(R.id.img);
}else{
holder =(ViewHolder)mView.getTag();
}
holder.title.setText(data.get(i).getTitle());
holder.desc.setText(data.get(i).getDesc());
holder.img.setImageResource(data.get(i).getIcon());
return mView;
1
hello2090 2021 年 11 月 24 日
虽然没做过 android 你这个 debug 一下不就是了
holder, holder.img 是不是空,arr 或者 arr.get(i) 是不是空 |
2
SupperMary 2021 年 11 月 24 日 adb shell 上去,logcat -b crash 会告诉你很详细的错误原因
|
4
hello2090 2021 年 11 月 24 日 @Features 很简单啊,arr 更新的时候打个 log, 运行 holder.img.setImageResource(arr.get(i).getRid()); 之前打个 log 看看呗
你这个只是读,而且还不是数值不对,而是直接 null, 应该不会是多线程的问题, |
5
mx8Y3o5w3M70LC4y 2021 年 11 月 24 日 via Android if 分支结尾需要 mView.setTag(holder)一下吧?现在安卓基本上不用 listview 了,基本上都是 recyclerview 来处理了。可以直接学 recyclerview
|
6
xFrye 2021 年 11 月 24 日 ListView? 有想过通过 getTag 获取到的 holder 是从哪里来的么? viewHolder 不存下来的话,怎么会拿得到呢
|
7
mx8Y3o5w3M70LC4y 2021 年 11 月 24 日 via Android
@xFrye 哈哈初学者,可能还不是太明白这个 item 复用吧
|
8
xFrye 2021 年 11 月 24 日
@lvdb 应该是的,不过写的时候还是要多思考一下。
https://juejin.cn/post/6844903911225032712 楼主可以看看这个梳理下,不过现在基本上确实 recyclerview 用的比较多了 |
9
busymilk 2021 年 11 月 24 日 via iPhone
你没有 setTag. getTag 当然是空
|
10
xuhaoyangx 2021 年 11 月 24 日
现在就别用 listview 了
|
12
Features OP @xuhaoyangx 只是当预热了解
|
13
sankemao 2021 年 11 月 24 日
没有 setTag,当然 get 不到,而且下面你的写法,失去了复用机制
|
14
youxiachai 2021 年 11 月 24 日
这代码...不是我 10 年前的写法吗....
现在用 RV 用不着这样写了啊... |
15
youxiachai 2021 年 11 月 24 日
不对...按道理,现在基本 RV 一把梭.... lz 用的什么入门资料..怎么还有这么远古的用法
|
18
Features OP @youxiachai 就是菜鸟教程,哈哈,没事,反正先了解下,应该都没问题吧
|
20
youxiachai 2021 年 11 月 24 日
@Features 现在有 google 的 codelab 那么好的教程....完全搞不懂现在的年轻人,怎么去看采集网站的教程..
|
21
Features OP @youxiachai 我是找了个视频,看了视频以后,做完视频的练习
再自己找一些练习做的,纯看教程我有点吃力,学不动的感觉 等我学完基础,肯定会去官网做一遍,巩固下 可能这就是学渣吧😂 学新知识都要学几回才能掌握 |
22
youxiachai 2021 年 11 月 24 日
@Features google 官方有专门针对新手的视频... 完整的一套最新,没必要看这种过时的资料
|
23
a4390509 2021 年 11 月 24 日 不崩溃是因为数据少,item 没有填充满一个屏幕,所以 view 没有复用,所以逻辑走到了 view==null 的逻辑分支里面。
崩溃是因为 view 复用了,但是你没有在 view 创建的时候 setTag ,所以在 else 逻辑分支里面获取的时候 getTag 是个空的 |
24
ykrank 2021 年 11 月 24 日 八年老 Android ,从 Android2.0 适配起,建议你不要学客户端了。历史知识太多,真要靠这个吃饭,现在既要精通 Android ,又要精通 JVM ,各种常用的第三方框架源码都得看。最新代码基本都是 kotlin 。google 官方的推荐框架换了一茬又一茬,每次学习都是新架构。但是你要维护的工程完全可能有各种历史代码,不知道历史原因的话看起来就是乱麻。
当然如果是自己写给自己玩的,那随意了,直接最新架构一把梭,完全不用在乎历史框架。不过这种情况下那也不如 google 新的 flutter ,还可以直接打包成 IOS 和 PC 端。 |
26
caixiangyu17 2021 年 11 月 25 日 现在学安卓直接从 kotlin 和 jetpack compose 入门吧,没有安卓面试会不问你 kotlin coroutine 的,所以别写 java 了
|
28
xuhaoyangx 2021 年 11 月 25 日
你真的要学 Android
直接用最新的谷歌 jetpack 的东西 Kotlin + Jetpack 一套框架 Kotlin + jetpack Compose 新的声明式 UI flutter 也可以看看,flutter 和 compose 基本是一种思想,会一个另一个基本也差不多了。 跨平台的可以学,但别以为能解万难,凡是涉及多一点点稍微底层一点的功能、API ,都要你懂原生。 我现在做 SDK 的,遇到太多来自别的端转移动端,只会 RN Flutter weex Uniapp 等这些,水的不行。 |
29
xuhaoyangx 2021 年 11 月 25 日
@Features 先学 kotlin
|
30
olindays 2021 年 11 月 25 日
用《第一行代码》第三版,学习 Android 开发的同时也学了 kotlin ,我个人觉得这本书对我这种菜鸟水平的编程爱好者很友好,你不妨试试看。
|
31
stardust21 2021 年 11 月 25 日
@ykrank 老哥中肯。
@Features 列表直接学 RV 吧,看官方文档就行: https://developer.android.google.cn/guide/topics/ui/layout/recyclerview |
32
kujio 2021 年 12 月 7 日
你这 holder 写的,holder 不是这么存的,也不是这么取的!
|