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

ListView性能优化系列之二

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

  上一节从应用层面给出了ListView性能优化的方法,这一节将从ListView源码中探寻真谛。
下集预告:这一小节讲垃圾回收站,下一个小节讲这个回收站具体是怎么用的,以及adapter中的getView方法是如何拿到回收站的内容的。

下面是ListView的继承关系

ListView继承自AbsListView,而在AbsListView中的RecycleBin就是上一节中View复用的关键。下面就对RecycleBin进行分析
RecycleBin
1、RecycleBin中的数据结构,这些数据结构就是在垃圾回收站堆放的一个个垃圾桶。
private RecyclerListener mRecyclerListener;
// 第一个存放在mActiveViews中的view的位置.
private int mFirstActivePosition;
// 用来存放屏幕可见区域的view
private View[] mActiveViews = new View[0];
/**
* 这个ArrayList就是adapter中getView方法中的参数convertView的来源
* 注意:这里是一个数组,因为如果adapter中数据有多种类型
* 那么就会有多个垃圾桶(对比垃圾分类)来放每一种垃圾
*/
private ArrayList<View>[] mScrapViews;

/*
* view的类型数,列表中可能有多种数据类型(根据adapter提供的数据)
*比如用户真正关心的数据,或者是分割符
*/
private int mViewTypeCount;
/*
* 其实就是指向mScrapViews[0]的一个引用,也就是第一种view对应的垃圾桶
*/
private ArrayList<View> mCurrentScrap;
   

2、RecycleBin中的重要主要方法分析
//从回收站中获取view
View getScrapView(int position) {
            ArrayList<View> scrapViews;
            if (mViewTypeCount == 1) {//只有一种视图类型
                scrapViews = mCurrentScrap;
                int size = scrapViews.size();
                if (size > 0) {
                    return scrapViews.remove(size - 1);//数据返回的同时,回收站中的内容被删除了
                } else {
                    return null;
                }
            } else {//多种数据类型
                int whichScrap = mAdapter.getItemViewType(position);
                if (whichScrap >= 0 && whichScrap < mScrapViews.length) {
                    scrapViews = mScrapViews[whichScrap];
                    int size = scrapViews.size();
                    if (size > 0) {
                        return scrapViews.remove(size - 1);
                    }
                }
            }
            return null;
        }


/**
	 * 将视图放入回收站
	 * @param scrap
	 */
	void addScrapView(View scrap) {
		AbsListView.LayoutParams lp = (AbsListView.LayoutParams) scrap
				.getLayoutParams();
		if (lp == null) {
			return;
		}
		int viewType = lp.viewType;
		if (!shouldRecycleViewType(viewType)) {//过滤掉不需要回收的view
			if (viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER) {
				removeDetachedView(scrap, false);//分发托管事件以及通知
			}
			return;
		}
		if (mViewTypeCount == 1) {//只有一种视图类型
			scrap.dispatchStartTemporaryDetach();
			mCurrentScrap.add(scrap);
		} else {//有多种视图类型
			scrap.dispatchStartTemporaryDetach();
			mScrapViews[viewType].add(scrap);
		}
		if (mRecyclerListener != null) {//监听器回调
			mRecyclerListener.onMovedToScrapHeap(scrap);
		}
	}

总结:贴了一大堆的代码,写了一大堆的注释,其实RecycleBin就是一个大的垃圾回收站,回收所有可以被回收的视图(源码过滤掉了不需要回收的视图,包括header和footer)。RecycleBin提供了一系列的方法对回收站进行管理。这里只是简单介绍了两个方法,其他方法有兴趣的同学可以自己看看。
  • 大小: 8.2 KB
分享到:
评论

相关推荐

    ListView性能优化系列之一

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

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

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

    Android listview嵌套listview

    2. **嵌套ListView的需求** - 当需要在一项数据内展示多级数据时,如商品列表,每种商品包含多个属性(颜色、尺寸)或者评论,这时就需要嵌套ListView。 3. **实现步骤** - **创建外部ListView的Adapter**: 首先...

    listview的小demo

    2. View Holder模式:这是一种优化策略,通过在convertView中保存视图引用,避免每次查找子视图导致的性能损耗。 3. 分批加载:如果数据量极大,可以考虑使用Header/Footer来实现分页加载,或者使用下拉刷新和上拉...

    ListView学习系列源码

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

    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在ListView中添加底纹

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

    Listview与Treeview混合

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

    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”,但还可以考虑使用...

    Listview单元格颜色设置

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

    srollview与listview共存

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

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

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

    ListviewDemo

    开发者通常需要了解如何创建Adapter,如何绑定数据,如何处理点击事件,以及如何优化ListView以提高性能,比如通过View Holder模式减少视图查找的时间,或者通过懒加载策略来处理大数据量的列表。 总之,“Listview...

Global site tag (gtag.js) - Google Analytics