android开发--ListView中的getView原理
其实这里的复用技术在列表中是十分常见的,iphone中的tableView也有相关的技术,cell的复用
工作原理:
- ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。
- 一个新的视图被返回并显示
如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!
实际上Android为你缓存了视图。
Android中有个叫做Recycler的构件,下图是他的工作原理:
- 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。
- ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。
- 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。
请看下面的示例代码,这里在getView中使用了System.out进行输出
public class MultipleItemsList extends ListActivity {private MyCustomAdapter mAdapter;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mAdapter = new MyCustomAdapter();for (int i = 0; i < 50; i++) {mAdapter.addItem("item " + i);}setListAdapter(mAdapter);}private class MyCustomAdapter extends BaseAdapter {private ArrayList mData = new ArrayList();private LayoutInflater mInflater;public MyCustomAdapter() {mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);}public void addItem(final String item) {mData.add(item);notifyDataSetChanged();}@Overridepublic int getCount() {return mData.size();}@Overridepublic String getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {System.out.println("getView " + position + " " + convertView);ViewHolder holder = null;if (convertView == null) {convertView = mInflater.inflate(R.layout.item1, null);holder = new ViewHolder();holder.textView = (TextView)convertView.findViewById(R.id.text);convertView.setTag(holder);} else {holder = (ViewHolder)convertView.getTag();}holder.textView.setText(mData.get(position));return convertView;}}public static class ViewHolder {public TextView textView;} }
android开发--ListView中的getView原理相关推荐
- android开发-Listview中显示不同的视图布局
在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够回收并重用,但是 ...
- android开发 listview 头部 轮播,listview添加的头部布局超过一屏头部内容显示不全...
headView的实际高度超过一个屏幕,但是显示的结果只有一个屏幕,超过一个屏幕高度意外的部分显示不全. 只使用了listView.getRefreshable().addHeadView(headV ...
- Android在ListView中嵌套一个GridView时只显示一行的原因及解决方法
在之前的编程里,我还没有遇到过要在一个ListView中嵌套一个GridView或是在一个GridView中嵌套一个ListView.所以今天事儿来了!我花了一将近3个小时,找到了为什么我在一个Lis ...
- Android 动态刷新listview中的数据
之前一直困扰listview刷新后位置的问题,现在才明白,原来不能重新设置listview的adapter,而应该用notifyDataSetChanged()来刷新,这样位置就不会置顶. 下面做了一 ...
- 42.Android之ListView中ArrayAdapter简单学习
今天学习下Android中ListView关于ArrayAdapter数据绑定, 废话少说直接上代码. 改下布局文件: 1 <?xml version="1.0" encod ...
- Android 关于ListView中按钮监听的优化问题(方法二)
关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...
- Android处理ListView中的Item中的Button按钮不能点击的问题
问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...
- android onitemclicklistener 参数,android – 对listview中的项使用setOnItemClickListener
大家好,有一个应用程序,可以在SD卡上保存音频.我创建了一个listview,它从sdcard中检索文件名.我正在尝试设置一个监听器,所以当单击文件名时,我可以启动另一个播放该文件的意图.当我尝试设置 ...
- Android开发应该了解的Binder原理,分享PDF高清版
正文 Android行业主要问题是初级Android太多了,会写xml和Activity的程序员太多了,初中级程序员面临很大的竞争,现状也就偏于高级开发者.越来越多的初中级Android程序员找不到满 ...
最新文章
- Nginx之简介与安装(一)
- 无法创建文件系统以及无法创建PV时怎么办?
- java测试工程师需要掌握什么_测试工程师需不需要了解开发知识?
- CSDN公式编辑(latex语言应用)整理
- JavaScript toLocaleString()时间转化为字符串
- 荣耀20青春版能升鸿蒙吗,荣耀20青春版上手 配置跑分如何
- php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解
- pip下载安装与环境配置
- CentOS7.2 在线安装MySQL8.0
- Python中Selenium设置无界面访问
- 计算机操作系统(汤小丹)慕课版课后题答案第五章:储存器管理
- AP 微积分 第12版 第4章参考答案
- 普通java类注入dao失败_spring mvc 整合mybatis dao接口注入失败
- (知乎)男生 25 岁了,应该明白哪些道理?
- android studio 顶部菜单栏消失了如何恢复
- 计算机开机错误怎么办,电脑开机蓝屏错误代码0X0000007E怎么办?
- python read_csv函数_Python pandas.read_csv()函数
- 走近Palantir
- 猫云bootcdn.cn
- Openlayers:Polygon绘图工具