`
heisedeyueya
  • 浏览: 97893 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

ListView性能优化系列之三

阅读更多
ListView性能优化系列之三

    上一节讲到了ListView中的垃圾回收站,用来管理回收view,这一节将继续学习源码,看看这个垃圾回收站到底是怎么用的,convertView是如何传递到adapter的getView方法的。

  • makeAndAddView:这个方法是在ListView里面,顾名思义,这个方法中有两个动词make和add,所以这个方法的作用是构造一个view并且将这个view加入到viewgroup的children list中去。

private View makeAndAddView(int position, int y, boolean flow,
			int childrenLeft, boolean selected) {
		View child;
		if (!mDataChanged) {// 数据没有发生改变
			child = mRecycler.getActiveView(position);// 从回收站的当前可见的视图列表中获取
			if (child != null) {
				/**
				 * 定位并且添加这个view到ViewGrop中的children列表,从回收站获取的视图不需要测量
				 * 所以最后一个参数为true
				 */
				setupChild(child, position, y, flow, childrenLeft, selected,true);
				return child;
			}
		}
		//获取一个view,有可能是从回收站拿到的,也可能是从新构造的一个view
		child = obtainView(position, mIsScrap);
		// 这个视图需要定位并且重新测量
		setupChild(child, position, y, flow, childrenLeft, selected, mIsScrap[0]);
		return child;
	}

obtainView:当这个方法被调用时,说明Recycle bin中的view已经不可用了,那么,现在唯一的方法就是,convert一个老的view,或者构造一个新的view。
View obtainView(int position, boolean[] isScrap) {
        isScrap[0] = false;
        View scrapView;
        scrapView = mRecycler.getScrapView(position);//从垃圾箱里面取数据
        View child;
        if (scrapView != null) {//当有数据的时候,直接通过老的view去convert(找不到一个合适翻译)
        	//调用第一节中adapter的getView方法,将scrapView传入,也就是我们的converView
            child = mAdapter.getView(position, scrapView, this);
            if (child != scrapView) {//返回的view和传入的scrapViwe不同
                mRecycler.addScrapView(scrapView);//放入垃圾桶
                if (mCacheColorHint != 0) {
                    child.setDrawingCacheBackgroundColor(mCacheColorHint);
                }
            } else {
                isScrap[0] = true;
                child.dispatchFinishTemporaryDetach();
            }
        } else {//回收站中没有拿到数据,就只能够自己去inflate一个xml布局文件,或者new一个view
            child = mAdapter.getView(position, null, this);//这里传入的converView=null
            if (mCacheColorHint != 0) {
                child.setDrawingCacheBackgroundColor(mCacheColorHint);
            }
        }
        return child;
    }

总结:用了三篇博客,耗时一天时间(打了一下午篮球,晚上加班),关于listview性能优化也讲的差不多了,接下来要分享什么呢?明天再看吧~~大家共同进步吧
分享到:
评论
1 楼 suguanglei 2013-07-04  
好文 学习

相关推荐

    ListView性能优化系列之一

    这篇博客“ListView性能优化系列之一”着重探讨了如何通过深入理解源码和利用特定工具来提升ListView的性能。 首先,了解ListView的工作原理是优化的基础。ListView采用的是滚动复用机制,即“视图回收”...

    Android应用开发中ListView组件性能优化的研究.pdf

    【Android应用开发中ListView组件性能优化的研究】 在Android应用开发中,ListView是常见的用于展示大量数据的组件,但在处理大量数据时,如果不进行性能优化,可能会导致应用出现卡顿、延迟甚至崩溃。本文主要探讨...

    Android listview嵌套listview

    - **ListView**: Android提供的可滚动视图,用于显示一系列相同的数据项。 - **Adapter**: ListView的数据源,负责将数据转化为ListView可显示的View。 2. **嵌套ListView的需求** - 当需要在一项数据内展示多级...

    ListView学习系列源码

    通过这个"ListView学习系列源码",你可以详细学习到如何创建自定义Adapter,实现ViewHolder,优化ListView性能,处理各种交互事件,以及动态加载和分页显示数据。实践这些源码,将有助于你成为一名更优秀的Android...

    listview的小demo

    ListView由一系列的View(或ViewGroup)组成,每个View代表列表中的一个项,通常称为列表项视图。在Android中,我们通常使用Adapter来连接ListView和数据源,Adapter负责将数据转化为列表项视图并将其添加到ListView...

    Android应用性能优化

    本篇文章将围绕“Android应用性能优化”这一主题,详细探讨Android应用架构的设计原则、常见性能瓶颈及其查找方法,并提供一系列有效的解决方案。 #### 一、Android应用架构设计原则 1. **模块化与解耦**:通过...

    ListView基础

    为了优化ListView的性能,通常使用ViewHolder设计模式。ViewHolder类保存了列表项视图中的各个子View,避免频繁的findViewById()操作,提高效率。 5. **点击事件处理** 可以通过设置OnItemClickListener或在...

    操作ListView控件源码

    总结来说,ListView是Android开发中处理数据展示的核心控件,熟练掌握ListView的操作和优化技巧对提升应用性能至关重要。提供的源码实例将帮助初学者快速理解这些概念并进行实践。通过学习和实践,开发者可以创建出...

    listview_delphi_ListView_delphi列表_

    7. 性能优化: 当ListView包含大量数据时,应考虑使用虚拟列表模式(Virtual Mode)。在这种模式下,ListView只在需要时绘制项,极大地提高了性能。 总之,通过自定义绘制和利用Delphi的图形API,我们可以创建出...

    Listview与Treeview混合

    总的来说,ListView与TreeView的混合使用涉及到数据绑定、事件处理、用户交互和性能优化等多个方面,需要开发者具备扎实的Windows编程基础和良好的问题解决能力。通过巧妙地结合这两种控件,可以创建出功能强大、...

    美化ListView在ListView中添加底纹

    - 性能优化:自定义绘制可能会对ListView的性能产生影响,尤其是在大数据量时。确保在不需要时关闭自定义绘制,或者优化绘制算法,减少不必要的计算。 - 兼容性:测试在不同操作系统和屏幕分辨率下的显示效果,确保...

    Android ListView 控件学习

    1. 使用ViewHolder模式:这是一种提高ListView性能的常用技巧,通过缓存视图引用,减少查找子视图的时间。 2. 减少getView()的复杂性:避免在getView()中执行耗时操作,如网络请求、图片加载等。 3. 使用AsyncTask或...

    xamarin开发安卓版本的listview翻页代码

    4. 使用convertView机制优化ListView性能。 5. 错误处理和异常捕获。 通过以上步骤,我们可以构建出一个功能完善的、支持翻页的ListView应用,同时能够适应大数据量的情况,提供良好的用户体验。

    Android viewpager+listview例子

    `ViewPager`和`ListView`的结合需要特别注意性能优化,因为它们都涉及到大量数据的加载和渲染。例如,使用`ViewHolder`模式来复用`ListView`的列表项视图,避免频繁创建和销毁视图;对于`ViewPager`,确保只加载必要...

    AndroidListView全选功能,非CheckBox

    9. **ListView性能优化**: - 由于ListView需要处理大量视图复用,因此需要注意convertView的使用,避免不必要的视图创建,提高性能。 10. **其他控件替代**: - 虽然标题提到“非CheckBox”,但还可以考虑使用...

    srollview与listview共存

    在Android开发中,ScrollView与ListView的共存是一个常见的需求,特别是在设计复杂布局时。这两个组件都是用于滚动内容,但它们的使用方式和目的各...同时,也要注意性能优化,避免因不当的布局设计而带来的额外负担。

    一个Activity中多个ListView的整体滑动

    在实际应用中,考虑到性能优化,可以使用ViewHolder设计模式来复用ListView的子项View,减少因频繁创建新View导致的性能损耗。ViewHolder是一个简单的类,用于存储ListView项View的引用,这样在填充数据时就可以直接...

    Listview单元格颜色设置

    2. **性能考虑**:大量的自定义绘制可能会导致性能下降,尤其是在大数据量的情况下,需要注意优化。 3. **用户可配置性**:提供用户自定义颜色的选项,增加应用程序的灵活性和易用性。 #### 六、扩展知识点 - **...

    WPF中Listview应用事例,在ListView中放Gridview和Label或TextBlock

    5. **性能优化**:当`ListView`中的数据量较大时,性能问题不容忽视。通过虚拟化技术(例如`VirtualizingStackPanel.IsVirtualizing="True"`),只加载当前可视区域内的项,可以显著提升性能。此外,合理设置`...

Global site tag (gtag.js) - Google Analytics