`
zlrvone
  • 浏览: 3097 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

android自定义adapter 滑动屏幕时 进度条显示混乱

阅读更多
    很久之前想找一份做android的工作 由于遇到了一份虽不是android 但其他方面还都比较满意的工作后 放弃了android梦 如今 公司也开始拓展了android项目 打听了一下 之前的公司也开始全面改做android 看来是都逃不过市场的趋向 有种殊途同归之感
    言归正传 在做一个小的练习(断点下载)时遇到了如下情况 需要自定义adapter动态添加listview listview中有两个固定控件 TextView 和 一个button 点击button 在listview中动态(addview)添加一个进度条 用来显示下载的进度 在一页的显示中没有问题 但是当翻页显示到下一页时 会出现进度条混乱的情况 并且没有规律 产生的原因要了解下自定义adapter的显示特性 在网上搜一下就可以找到基本原理了 不再重复 这里说一下其他文章没有涉及到的东西 下面是我的程序打出的log 在getView()中添加语句:
		System.out.println("In GETVIEW ---- " +  convertView.toString() + "---- position ---- " + position);

In GETVIEW ---- android.widget.LinearLayout@ 44f1fdd8 ---- position ---- 0
In GETVIEW ---- android.widget.LinearLayout@ 44f28828 ---- position ---- 1
In GETVIEW ---- android.widget.LinearLayout@ 44f2c1a8 ---- position ---- 2
In GETVIEW ---- android.widget.LinearLayout@ 44f2fb28 ---- position ---- 3
In GETVIEW ---- android.widget.LinearLayout@ 44f334a8 ---- position ---- 4
In GETVIEW ---- android.widget.LinearLayout@ 44f36e60 ---- position ---- 5
In GETVIEW ---- android.widget.LinearLayout@ 44f3a7e0 ---- position ---- 6
In GETVIEW ---- android.widget.LinearLayout@ 44f3e160 ---- position ---- 7
In GETVIEW ---- android.widget.LinearLayout@ 44f1fdd8 ---- position ---- 8
In GETVIEW ---- android.widget.LinearLayout@ 44f4bde0 ---- position ---- 9
In GETVIEW ---- android.widget.LinearLayout@ 44f28828 ---- position ---- 10
In GETVIEW ---- android.widget.LinearLayout@ 44f2c1a8 ---- position ---- 11
In GETVIEW ---- android.widget.LinearLayout@ 44f2fb28 ---- position ---- 12
In GETVIEW ---- android.widget.LinearLayout@ 44f334a8 ---- position ---- 13

    在我的modis上 可以显示出7个listview 也就是在position ---- 8位置的listview是需要绘制出来的新条目 我们看到新绘制的listview用了一个新的convertView对象 position ---- 9也一样是新的convertView对象 从 position ---- 10开始往后 就是按照顺序拿出缓存中的1 2 3 4来绘制listview 这样我看似乎看到了一个解决问题的办法 即可以预想到有进度条的listview何时在缓存中被取出 那样我们就可以去掉progressbar 本人也试验过这个想法 没有成功 原因如下 重新来看一组log
In GETVIEW ---- android.widget.LinearLayout@ 44f89f98 ---- position ---- 0
In GETVIEW ---- android.widget.LinearLayout@ 44f8c6b8 ---- position ---- 1
In GETVIEW ---- android.widget.LinearLayout@ 44f39598 ---- position ---- 2
In GETVIEW ---- android.widget.LinearLayout@ 44f01b40 ---- position ---- 3
In GETVIEW ---- android.widget.LinearLayout@ 44f769e8 ---- position ---- 4
In GETVIEW ---- android.widget.LinearLayout@ 44f4dfa8 ---- position ---- 5
In GETVIEW ---- android.widget.LinearLayout@ 44ed7db0 ---- position ---- 6
In GETVIEW ---- android.widget.LinearLayout@ 44f550c0 ---- position ---- 7
In GETVIEW ---- android.widget.LinearLayout@ 44f39598 ---- position ---- 8
In GETVIEW ---- android.widget.LinearLayout@ 44f8c6b8 ---- position ---- 9
In GETVIEW ---- android.widget.LinearLayout@ 44f89f98 ---- position ---- 10
In GETVIEW ---- android.widget.LinearLayout@ 44f9d3e8 ---- position ---- 11
In GETVIEW ---- android.widget.LinearLayout@ 44f01b40 ---- position ---- 12
In GETVIEW ---- android.widget.LinearLayout@ 44f4dfa8 ---- position ---- 13

    这组log是在快速拖动滚动条时的log 发现当快速滚动时 position ---- 8在绘制时直接拿到的是position ---- 2的convertView 而下面的9 10 11位置上用到的convertView也是没有规律可循的 每次快速的滚动条目时 log也是不一样的
    我的猜测是这样的 在缓慢拖动时 第一个显示的条目由可见到不可见 并且是逐渐的不可见 存在这样的情况 第一个条目的一半不可见 此时必将有一个新的条目要绘制出一半 这样系统给我们提供了两个新的convertView 来绘制显示 以维持这个缓存 而当快速拖动时 上面的条目会快速的被掩盖 马上进入缓存 以备下面条目的显示 不知道这样理解是否正确 希望了解这个机制的人做下纠正
    所以现在的可以总结为 我们不知道缓存中convertView何时被拿出来显示 也不知道哪个convertView有progressbar这个控件 所以我想到了一个办法 去掉所有控件后 重新加载控件 但是在做convertView = listContainer.inflate(R.layout.itemlist, null);这个操作的时候 相当于重新new了一个convertView 这样就违背了缓存机制节省资源的意图 因此最后想到的办法是在getview函数中 每次从缓存中拿出convertView时 都检查是否有progressbar这个控件 有的话 去掉此控件 再重新绘制progressbar 主要代码如下:
		if (convertView == null) {
			listitemview = new ListItemView();
			convertView = listContainer.inflate(R.layout.itemlist, null);
			convertView.setTag(listitemview);

		} else {
//主要部分
			listitemview = (ListItemView) convertView.getTag();
			LinearLayout m_layout = ((LinearLayout) convertView);
			for (int i = 0; i < m_layout.getChildCount(); i++) {
				if (m_layout.getChildAt(i) instanceof ProgressBar) {
					m_layout.removeViewAt(i);
				}
			}
		}

    这样就可以解决问题了
    在解决问题的过程中 上网查了很多资料 但是没有找到很好解决这个问题的方法 于是在这里记录一下自己解决问题的过程 也算记笔记了 当然这个办法肯定不是最好的 每次需要循环listview中的所有控件 当然可以减少循环的几率 判断convertView中的控件数目 我也想过 如果progressbar不是动态加载进去(addview) 而是在R.layout.itemlist中定义 默认设为不可见状态 每次调用getview时 检查是否需要变成可见状态 也是可以实现的 由于这个程序是要断点下载 所以检查过程就是去看数据库中是否有下载的记录即可 不过我没有做尝试
    ps:我还真证明不了这个是我写的。。。。

同步于CMD100博客
1
1
分享到:
评论
2 楼 aboutibm 2013-08-24  
这么做可以解决问题,但是有点麻烦了,简单点的解决办法为:
if(......){
    holder.downloadProgressBar.setProgress(value);
    holder.downloadProgressBar.setVisibility(ProgressBar.VISIBLE);
}else{
    holder.downloadProgressBar.setProgress(0);
    holder.downloadProgressBar.setVisibility(ProgressBar.INVISIBLE);
}

即符合条件的显示,不符合条件的隐藏即可解决问题
1 楼 w1041966246 2012-09-14  
哥们 能给点代码研究研究吗? 我现在正纠结这问题呢? 网上找的资料都是你这一篇啊。

相关推荐

    RecyclerView的下拉刷新和上拉加载

    当用户在顶部滑动列表时,会显示一个旋转的指示器,表示内容正在更新。要集成SwipeRefreshLayout到RecyclerView,你需要做以下几步: 1. 在布局文件中添加SwipeRefreshLayout作为RecyclerView的父布局。 2. 将...

    scratch少儿编程逻辑思维游戏源码-Pyorovania.zip

    scratch少儿编程逻辑思维游戏源码-Pyorovania.zip

    scratch少儿编程逻辑思维游戏源码-弹力猫.zip

    scratch少儿编程逻辑思维游戏源码-弹力猫.zip

    scratch少儿编程逻辑思维游戏源码-地心引力.zip

    scratch少儿编程逻辑思维游戏源码-地心引力.zip

    基于金枪鱼群优化算法的SVM在多变量时间序列预测中的MATLAB实现及优化

    内容概要:本文介绍了一种基于金枪鱼群优化算法(TSO)和支持向量机(SVM)的混合算法模型——TSO-SVM,在多变量时间序列预测中的应用。文中详细解释了TSO-SVM的工作原理,即通过模拟金枪鱼群觅食行为来优化SVM的参数,从而提升预测性能。同时提供了具体的Matlab代码实现步骤,包括参数初始化、模型训练和预测。实验结果显示,TSO-SVM相较于传统SVM方法,显著提升了预测的准确性和稳定性,并展示了良好的泛化能力。 适合人群:对机器学习尤其是时间序列预测感兴趣的科研人员和技术开发者。 使用场景及目标:①需要进行多变量时间序列预测的研究项目;②希望利用自然启发式优化算法改善现有SVM模型效果的技术团队。 其他说明:推荐使用Libsvm工具箱配合Matlab 2018B及以上版本,仅限于Windows 64位操作系统。

    机器视觉技术:OpenCV与Qt在工业相机采集及图像处理中的应用

    内容概要:本文深入探讨了机器视觉技术,重点介绍了OpenCV和Qt在工业相机采集及图像处理中的应用。文中详细讲述了卡尺工具、找线、找圆、颜色检测、模板匹配及形状匹配等关键技术的具体实现方法,并特别强调了海康工业相机采集与基于形状的模板匹配界面的开发。此外,形状匹配算法已被封装成DLL,方便直接调用。通过实际案例和技术解析,帮助读者全面掌握机器视觉系统的构建。 适合人群:对机器视觉感兴趣的初学者、有一定编程基础的研发人员、从事工业自动化领域的工程师。 使用场景及目标:适用于希望深入了解机器视觉技术及其应用场景的专业人士,旨在提升图像处理能力,优化工业自动化流程,提高生产效率。 其他说明:文章不仅提供理论知识,还附有示例代码,便于读者动手实践并加深理解。

    scratch少儿编程逻辑思维游戏源码-Billy奇妙之旅.zip

    scratch少儿编程逻辑思维游戏源码-Billy奇妙之旅.zip

    电动汽车BMS电池管理系统应用层软件模型:MBD方法、通信协议及AUTOSAR构建

    内容概要:本文详细介绍了基于模型开发(MBD)的BMS电池管理系统应用层软件模型。首先概述了BMS的核心任务,即确保电池的安全与高效运行,涉及充电、放电控制、实时监测和电池均衡管理。接着重点讨论了SUMlink电池管理系统策略模型,该模型通过收集和处理电池的数据(如电压、电流、温度),并运用多种算法(如SOC估算、SOH评估)来优化电池性能。文中还阐述了BMC CVS内部通讯协议DBC的作用,确保各模块间数据传输的准确性与效率。最后,介绍了AUTOSAR标准在BMS系统中的应用,特别是针对MPC5644A芯片的底层Build工程,提高了系统的可维护性、可扩展性和可靠性。此外,提到了INCA A2L标定文件的应用,用于配置和调整系统参数,以满足不同需求。 适合人群:从事电动汽车电池管理系统研究与开发的技术人员,尤其是对MBD方法、通信协议和AUTOSAR标准感兴趣的工程师。 使用场景及目标:适用于希望深入了解BMS系统的设计原理和技术细节的专业人士,旨在提高他们对该领域的理解和实际操作能力。 其他说明:通过对代码的具体分析,读者能够更加直观地理解BMS的工作流程及其各个组件间的协作关系。

    少儿编程scratch项目源代码文件案例素材-深海困境.zip

    少儿编程scratch项目源代码文件案例素材-深海困境.zip

    少儿编程scratch项目源代码文件案例素材-去吧泡泡糖.zip

    少儿编程scratch项目源代码文件案例素材-去吧泡泡糖.zip

    KEPServerEX6-6.17.269.0

    KEPServerEX6-6.17.269.0,最新版

    scratch少儿编程逻辑思维游戏源码-第二个循环.zip

    scratch少儿编程逻辑思维游戏源码-第二个循环.zip

    少儿编程scratch项目源代码文件案例素材-手里剑.zip

    少儿编程scratch项目源代码文件案例素材-手里剑.zip

    少儿编程scratch项目源代码文件案例素材-山地跳跃.zip

    少儿编程scratch项目源代码文件案例素材-山地跳跃.zip

    机器人路径规划中Informed RRT*算法详解与代码实现

    内容概要:本文详细介绍了Informed RRT*算法及其在机器人路径规划领域的应用。文章首先解释了该算法相较于传统RRT*算法的优势,即通过将采样范围限制在由起点和终点构成的椭圆区域内来提高搜索效率。接着,文中提供了具体的代码实现,包括椭圆采样的核心公式、路径优化的rewire步骤以及动态调整邻居半径的方法。此外,还讨论了路径队列管理和椭圆区域随路径优化动态更新的重要性。通过这些技术手段,Informed RRT*能够在找到初始路径后显著加快优化速度。 适合人群:对机器人路径规划感兴趣的科研人员、工程师及学生。 使用场景及目标:适用于需要高效路径规划的实际应用场景,如自动驾驶汽车、无人机飞行路径规划等。目标是在复杂环境中快速找到从起点到终点的最佳路径。 其他说明:建议读者在理解理论的基础上,结合提供的代码进行实验,以便更好地掌握算法的工作机制。同时,在不同环境条件下测试算法性能,观察其自适应能力。

    基于COMSOL有限元仿真的变压器辐射传热数值分析:从入门到进阶

    内容概要:本文详细介绍了基于COMSOL有限元软件的变压器辐射传热数值分析方法。首先,解释了变压器内外辐射传热的基本机理,包括热量通过传导、对流和辐射的方式传递,重点在于辐射传热的作用及其数学描述。接着,逐步引导读者从零开始构建有限元仿真模型,涵盖模型参数确定、网格划分、材料属性定义、边界条件设置、传热方程设定、仿真运行及结果分析等多个步骤。最后,探讨了进一步研究的方向,如不同因素(温度、材料属性、几何形状)对辐射传热的影响,以及该模型在电力电子设备和热管理系统的潜在应用。 适合人群:电气工程专业学生、初学者和技术爱好者,尤其是对有限元仿真和变压器辐射传热感兴趣的群体。 使用场景及目标:适用于希望通过实际操作掌握有限元仿真技能的人群,旨在帮助他们理解变压器辐射传热机制并能独立完成相关仿真项目。 其他说明:本文不仅提供了理论知识,还附带了详细的视频教程和仿真模型,使学习过程更加直观易懂。

    scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip

    scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip

    scratch少儿编程逻辑思维游戏源码-超级马里奥兄 回放引擎.zip

    scratch少儿编程逻辑思维游戏源码-超级马里奥兄 回放引擎.zip

    少儿编程scratch项目源代码文件案例素材-你准备好了吗?.zip

    少儿编程scratch项目源代码文件案例素材-你准备好了吗?.zip

    少儿编程scratch项目源代码文件案例素材-潜水艇.zip

    少儿编程scratch项目源代码文件案例素材-潜水艇.zip

Global site tag (gtag.js) - Google Analytics