记得一个月前,第一次听到ListView,怎么看都没看懂ListView的节省内存的机制。对于此事还被别人狠狠嘲笑了一番”lian ge listview dou bu hui"。。心痛指数===3颗星
今天打算做一个新闻类app,作为一个app初学者,很多知识完全不懂,先在学的过程中先记下来学到的知识点,希望以后还可以回来查删改一下下= =
1、BaseAdapter
BaseAdapter是一个抽象类,他没有绑定数据,需要我们重新写getCount() getItem(int position) getItemId() getView()函数,其中最重要的是getView函数。
2、 LayoutInflater
LayoutInflater用于加载布局,首先需要通过LayoutInflater.from(context)获取LayoutInflater对象,然后通过LayoutInflater.inflater(resourceId, root)实现设置布局。
同时获取LayoutInflater对象时还可以通过
- LayoutInflater layoutInflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 获得
3、ListView
ListView属于AdapterView子类,它需要adapter和数据建立连接,但是ListView的机制是什么呢?
========转载地址:http://blog.csdn.net/yelbosh/article/details/7831812=========我觉得他写的很容易懂,反正我是看明白了==========
为什么需要优化呢?因为如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?这不可能,因为内存有限制。实际上Android为你缓存了视图。Android中有个叫做Recycler的构件,下图是他的工作原理:
如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。其实我的理解Recyler就是一个队列,用来存储不在屏幕范围内的item,如果item滚出屏幕范围,那么就入队,这里的滚出是完全滚出,即边界等也要完全滚出。如果新的item要滚进来,那么android系统的framework就会查看Recyler是否含有可以重复使用的iew,如果有那么就重新设置该iew 的数据源,然后显示,即出队。那么这么多的item其实只需要占用一定空间的内存,这个内存大小是多少呢?我的感觉是手机屏幕所包含的item的个数,再加上1,然后乘以每个item占用的内存。但是最后我发现是加上2.可能是为了使得缓存更大吧。。。。但是为什么加上2,大家应该理解,如果你不理解,那你就把滚动list的过程好好想一想。那个队列无非就是一个缓存罢了,因为我们的目的是通过那个缓存来重复使用那些已经创建的iew。