ListView展示不同布局需要注意的地方
尊重劳动成果,转载请标明出处:http://www.cnblogs.com/tangZH/p/8419010.html
我们在项目中经常需在一个listview中展示不一样的布局,我们可以在adapter的getView()中根据position来决定该展示哪些布局。
我在项目中便是如此,第一个item是展示一张图片(判断当position==0的时候返回该图片),而当position不为0的时候返回我们需要的布局,如下:
ViewHolder viewHolder = new ViewHolder(); if (view == null) { view = mInflater.inflate(R.layout.listview_item, viewGroup, false); viewHolder.textCate = view.findViewById(R.id.discover_text_category); viewHolder.textView = view.findViewById(R.id.discover_view_all); viewHolder.arrow = view.findViewById(R.id.discover_arrow); viewHolder.divider = view.findViewById(R.id.discover_item_divider); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); }
//下面这里执行相应的操作,举一个例子
viewHolder.textCate.setText("A")
可是这时候问题来了,滑动到下面的时候报错:找不到组件textCate
苦思良久,最终我是这样分析的:
listView的item会复用,也就是滑动到下面的时候,下面的item会复用第一个item,也就是图片,然后代码在判断view == null的时候不成立,于是执行
viewHolder = (ViewHolder) view.getTag();
而我们没有给图片设置tag,取出来的当然为空,因此下面会报空指针。
有什么觉方法呢?
其实很简单,只要在判断view == null后面再加上一个判断就行了:
if (view == null || view.getTag() == null)
当view为null或者view取出来的tag也为null的时候,那就需要去重新加载布局,设置tag
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?