`
heisedeyueya
  • 浏览: 96748 次
  • 性别: 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性能优化系列之一

    源码 博文链接:https://heisedeyueya.iteye.com/blog/1689498

    android开发资料大全

    Android应用开发者指南:性能优化 android开发教程合集(推荐新手看下这一季教程) 新手入门 会员贡献电子图书整理(内含PDF下载) Android平板开发需要注意的几点 Android3D游戏开发付费视频教程共享(更新第四集)...

    asp.net知识库

    ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 NET2.0系列介绍(一).NET 2.0 中Web 应用程序主题的切换 ASP.NET 2.0 中Web 应用程序主题的切换 2.0正式版中...

    JAVA上百实例源码以及开源项目源代码

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    JAVA上百实例源码以及开源项目

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

Global site tag (gtag.js) - Google Analytics