热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ListView中出现Null附属(mAttachInfo==null)的情况

最近在我的项目中加入了自定义的TextAreaView,由于项目是在Dialog中只存在一个ListView.发现在此过程中第一条项目(也就是第一个View失去了mAttachInfo).从而导

最近在我的项目中加入了自定义的TextAreaView,由于项目是在Dialog中只存在一个ListView.发现在此过程中第一条项目(也就是第一个View失去了mAttachInfo).从而导致View处于半瘫痪状态,也就是说View未被执行dispatchAttachedToWindow方法,从而导致View中的Handler为空指针.,也就导致了Post等一切利用View中Hanler进行视图绘制操作无效,除非调用父类进行重绘.

分析开始:

1. 首先我自定义的TextAreaView中有光标重绘的操作,是利用的View中的Post线程进行绘制,但是,我在View中的Post方法中打上Log后,发现确实调用了Post的方法,也就是说我自定义的View没有问题,鉴于第二条第三条View项目都处于正常状态,只有第一条处于瘫痪状态.将问题缩小到Post方法中.

2.使用反射获取Post方法执行时的测试条件if(mAttachInfo == null){...}发现mAttachInfo为空指针.由于我们都知道View在附属的过程中,是通过Parent往下递归附属的,所以我再次反射去查看View中的View.mParent变量是否也为Null,发现此Parent不为Null,由此得出,改View只是未被执行dispatchAttachedToWindow方法.

3.寻找ViewGroup中的执行过程,发现dispatchAttachedToWindow方法实在执行addViewInLayout方法中进行的,也就是说,ListView未对该View执行addViewInLayout,方法.

4.寻找ListView中的addViewInLayout方法.

    AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();
if (p == null) {
p = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0);
}
p.viewType = mAdapter.getItemViewType(position);

if ((recycled && !p.forceAdd) || (p.recycledHeaderFooter &&
p.viewType == AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER)) {
attachViewToParent(child, flowDown ? -1 : 0, p);
} else {
p.forceAdd = false;
if (p.viewType == AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER) {
p.recycledHeaderFooter = true;
}
addViewInLayout(child, flowDown ? -1 : 0, p, true);
}
与此可见一定是第一条if语句被执行了,由于我并没有设置Header所有if语句第二个条件不可能通过,只有第一个

由此发现recycled为true,也就是说我的第一条View在返回知道直接被ListView进行了recyle,并且我的LayoutParams中的forceAdd==false.或者LayoutParams == null,

5.我发现ListView在测量过程中如下执行:


mItemCount = mAdapter == null ? 0 : mAdapter.getCount();
if (mItemCount > 0 && (widthMode == MeasureSpec.UNSPECIFIED ||
heightMode == MeasureSpec.UNSPECIFIED)) {
final View child = obtainView(0, mIsScrap);

measureScrapChild(child, 0, widthMeasureSpec);

childWidth = child.getMeasuredWidth();
childHeight = child.getMeasuredHeight();
childState = combineMeasuredStates(childState, child.getMeasuredState());

if (recycleOnMeasure() && mRecycler.shouldRecycleViewType(
((LayoutParams) child.getLayoutParams()).viewType)) {
mRecycler.addScrapView(child, -1);
}
}
也就是说第一条项目会被特殊处理,直接添加到mRecucler中,从而导致recyle为true,但是在measureScrapChild方法中会进行如下

    private void measureScrapChild(View child, int position, int widthMeasureSpec) {
LayoutParams p = (LayoutParams) child.getLayoutParams();
if (p == null) {
p = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0);
child.setLayoutParams(p);
}
p.viewType = mAdapter.getItemViewType(position);
p.forceAdd = true;
也就是说p.forceAdd被设置为true,由此第4个中的if条件是不可能被执行的,除非p.forceAdd 被赋值为 false.

6.我已经说过没有被执行addViewInLayout,所以p,forceAdd被赋值为false,是不可能在ListView中进行的,那么只有一个原因了,那就是我们重新设置了该项目的LayoutParames,这样LayoutParames中的forceAdd才能为false.

7.我检测我的方法发现,我在getView中由于马虎,竟然将LayoutParames进行了多次设置,也就是说不管是不是View复用,我都new一个新的LayoutParams添加到View中,从而导致了forceAdd为false的情况.将setLayoutParames(new LayoutParames)设置在cOnvertView== null的情况下,问题解决


Node:我又发现,此问题只会发生在Dialog模式下,因为我在Framget中的ListView如此设置并没有出现任何问题,这个问题保留一下,再去详细的查找原因吧.



推荐阅读
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • Android开发常见问题汇总(含Gradle解决方案)第二篇
    本文继续深入探讨Android开发中常见的问题及其解决方案,特别聚焦于Gradle相关的挑战。通过详细分析和实例演示,帮助开发者高效解决构建过程中的各种难题,提升开发效率和项目稳定性。 ... [详细]
  • ListView想要做到上下翻页的效果需要使用如下参数positionViewAtIndex(intindex,PositionModemode)P ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 申请地址:https://developer.apple.com/appstore/contact/?topic=expedite 常见申请理由:1. 我们即将发布新产品,这是一个媒体活动,我们无法承担任何风险,因此在多个方面努力提升应用质量。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文介绍了一种利用Dom4j库和JFileChooser组件在Java中实现XML文件自定义路径导出的方法。通过创建一个Document对象并设置根元素,结合JFileChooser选择目标路径,实现了灵活的XML文件导出功能。具体步骤包括初始化Document对象、构建XML结构以及使用JFileChooser选择保存路径,确保用户能够方便地将生成的XML文件保存到指定位置。 ... [详细]
  • 英语面试技巧:提升个人技能与表现
    在英语面试中,个人技能是指除专业知识外,能够促进职业发展的各种能力。虽然你可能具备多种技能,但建议重点突出与目标岗位最相关的几项,以增强面试官对你专业能力和适应性的认可。 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • 具有顺序标题的ListView ... [详细]
author-avatar
不完整的记忆721_560
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有