`
zlrvone
  • 浏览: 3049 次
  • 性别: 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  
哥们 能给点代码研究研究吗? 我现在正纠结这问题呢? 网上找的资料都是你这一篇啊。

相关推荐

    Android自定义adapter的listview

    Android提供了一些预定义的Adapter,如ArrayAdapter和CursorAdapter,但它们可能无法满足所有需求,因此我们常常需要自定义Adapter。 自定义Adapter的步骤如下: 1. 创建一个新的类,继承自BaseAdapter或已有的...

    Android自定义Adapter适配器

    总之,自定义Adapter是Android开发中的一个重要技能,它允许开发者灵活地控制数据的显示方式,同时提高了应用的可扩展性和可维护性。通过实践和研究这个自定义Adapter的代码,你将能更好地掌握这一核心技术。

    GridView用自定义Adapter

    当我们需要显示的数据不满足默认Adapter提供的功能时,自定义Adapter就显得尤为重要。本篇将深入探讨如何为GridView创建自定义Adapter,以实现更灵活、个性化的数据展示。 首先,了解Adapter的基本概念。Adapter是...

    Android中自定义滑动选中控件WheelView

    在Android开发中,有时我们需要创建具有独特交互效果的控件,比如滑动选择器,而`WheelView`就是这样一种自定义的控件。它通常用于日期选择、时间选择或者选项滚动等场景,提供了类似滚轮的视觉效果和操作体验。在你...

    Android之自定义Adapter的ListView

    在自定义Adapter时,我们需要实现四个核心方法:`getCount()`、`getItem(int position)`、`getItemId(int position)`和`getView(int position, View convertView, ViewGroup parent)`。 1. `getCount()`:返回数据...

    android自定义listview滑动删除

    这个自定义的ListView案例中,开发者可能通过监听触摸事件,计算滑动距离和方向,当滑动达到一定阈值时显示删除按钮,用户再次滑动或者点击按钮即可完成删除操作。 要实现这个功能,首先你需要创建一个自定义的...

    自定义Adapter适应ListView和GridView

    通过自定义Adapter,我们可以实现各种复杂的列表和网格视图,如带头像和标题的列表项、可滑动的卡片视图、包含多个子视图的复杂项等。同时,自定义Adapter也是学习Android数据绑定和视图复用机制的好途径。 总之,...

    Android 自定义可上下左右滑动table

    标题"Android 自定义可上下左右滑动table"指向的就是一个专门为Android平台设计的定制化表格控件,它不仅支持垂直滚动(上下滑动),还支持水平滚动(左右滑动),这在处理大数据量或需要展示宽幅信息时非常有用。...

    ListView中使用自定义Adapter及时更新数据

    本篇将详细讲解如何在ListView中使用自定义Adapter来实现数据的及时更新。 首先,我们需要理解ListView的工作原理。ListView通过Adapter来与数据源进行交互,Adapter是连接数据集和视图的桥梁。它负责从数据集中...

    自定义可滑动日历

    在Android开发中,创建一个自定义的可滑动日历是一项常见的需求,这不仅可以提供用户友好的界面,还可以实现特定的业务逻辑。本项目“自定义可滑动日历”正是针对这一需求而设计的。它利用了Android的...

    Android ListView 自定义adapter好友列表

    在Android开发中,ListView是一种...总之,通过自定义Adapter,我们可以根据需求自由设计Android应用中的好友列表,实现各种复杂的显示效果和交互操作。熟练掌握Adapter的使用对于提升Android应用的用户体验至关重要。

    Android自定义控件实现导航条IndicatorView

    本文将深入探讨如何实现一个自定义的导航条IndicatorView,该控件具备滚动、快速滚动以及自动滚动到选中项完全显示在屏幕上的功能。我们将分为以下几个部分进行讲解: 1. **基础概念与需求分析** - IndicatorView...

    android studio 自定义adapter开发闹钟小案例

    在Android应用开发中,我们经常需要处理数据的展示和交互,这时自定义Adapter就显得尤为重要。本案例"android studio 自定义adapter开发闹钟小案例"将带你深入理解如何在Android Studio中利用Adapter来构建一个实用...

    android 制作有图标的文件资源管理器 自定义Adapter

    在Android开发中,创建一个带有图标的文件资源管理器通常涉及到自定义Adapter的实现。Adapter是连接数据源和UI视图的关键组件,它允许我们把数据转化为可显示的视图元素。下面将详细介绍如何在Android中制作这样一个...

    自定义Adapter 实例

    当我们需要将数据集合显示在ListView、GridView或者RecyclerView等视图组件时,就需要自定义Adapter来实现这一功能。本实例主要讲解如何自定义一个Adapter类,继承自BaseAdapter。 首先,我们需要了解Adapter的基本...

    Android自定义Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

    本篇文章将详细介绍如何在Android中自定义Spinner的下拉列表,包括使用ArrayAdapter和自定义Adapter两种方法。 ### 一、使用ArrayAdapter ArrayAdapter是Android提供的基础适配器,它可以方便地将数组数据与...

    android自定义导航栏

    在Android开发中,自定义导航栏是一个常见的需求,特别是在追求个性化设计和功能扩展时。本文将详细介绍如何在Android项目中创建一个可以滑动且数量可变的自定义导航栏,以此来满足特定的用户交互需求。 首先,我们...

    安卓Android 排班自定义view 支持左右上下滑动 支持点击事件,支持更改每个框的内容

    标题提到的"安卓Android 排班自定义view 支持左右上下滑动 支持点击事件,支持更改每个框的内容",这是一个专为排班场景设计的自定义View组件,它具有高度的可定制性和交互性。 首先,这个自定义View能够实现左右...

    Android双向表格可滑动可双向适配

    本项目“Android双向表格可滑动可双向适配”着重于实现这样的功能,并在此基础上增加了自定义表头以及横向适配的能力。这在展示复杂数据集时尤其有用,例如在电商应用的商品列表或财务软件的报表中。 1. **双向滚动...

    android ListView item下载 ListView 进度条下载 ListView多个下载

    android ListView item下载 ListView 进度条下载 ListView多个下载 android:ListView的局部刷新 Android中自定义Adapter实现ListView动态刷新进度条 android listview局部刷新和模拟应用下载

Global site tag (gtag.js) - Google Analytics