Android ViewHolder模式示例
现在,我们将对Android ListView的平滑滚动进行编码。 在上一篇文章中 ,我们试图了解带适配器的ListView的工作方式。 这次,一切将与性能有关。
我之所以单独发表这篇文章是因为有时很难理解Android ListView 。 我想到的是:“我们必须先做基础,然后再应用优化。”
ViewHolder模式是什么?
ViewHolder设计模式使您无需查找即可访问每个列表项视图,从而节省了宝贵的处理器周期。 具体来说,它避免了ListView滚动期间频繁调用findViewById()并使它变得平滑。
没有ViewHolder设计模式
好的,让我们深入研究一下,看看它在没有 ViewHolder模式的情况下如何工作。
让我们看看ArrayAdapterItem.java中以前的 getView()方法
- 第一次加载时,convertView为null。 我们将不得不增加列表项的布局,并通过findViewById()找到TextView。
- 第二次加载时,convertView不为null,很好! 我们不必再给它充气。 但是,我们将再次使用findViewById()。
- 在以下几次加载时,convertView绝对不是null。 但是findViewById()会不断地被调用,它将起作用,但是,它会降低性能,特别是如果ListView中有很多项目和视图时。
使用ViewHolder设计模式
现在,让我们看看它如何与 ViewHolder模式一起使用。
- 第一次加载时,convertView为null。 我们必须膨胀列表项的布局,实例化ViewHolder,通过findViewById()找到TextView并将其分配给ViewHolder,然后将ViewHolder设置为convertView的标记。
- 第二次加载时,convertView不为null,很好! 我们不必再给它充气。 令人高兴的是,由于我们现在可以通过其ViewHolder访问TextView,因此不必调用findViewById()。
- 下次加载时,convertView绝对不是null。 不再调用findViewById(),这使我们的ListView平滑滚动。
让我们编码!
就是这样,我们将在ListView中使用Android ViewHolder模式 (仅3个步骤!)。
步骤1 :在我们的ArrayAdapterItem.java文件中添加以下静态类
// our ViewHolder.
// caches our TextView
static class ViewHolderItem {TextView textViewItem;
}
步骤2 :我们的getView()现在看起来像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {ViewHolderItem viewHolder;/** The convertView argument is essentially a "ScrapView" as described is Lucas post * http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/* It will have a non-null value when ListView is asking you recycle the row layout. * So, when convertView is not null, you should simply update its contents instead of inflating a new row layout.*/if(convertView==null){// inflate the layoutLayoutInflater inflater = ((Activity) mContext).getLayoutInflater();convertView = inflater.inflate(layoutResourceId, parent, false);// well set up the ViewHolderviewHolder = new ViewHolderItem();viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.textViewItem);// store the holder with the view.convertView.setTag(viewHolder);}else{// we've just avoided calling findViewById() on resource everytime// just use the viewHolderviewHolder = (ViewHolderItem) convertView.getTag();}// object item based on the positionObjectItem objectItem = data[position];// assign values if the object is not nullif(objectItem != null) {// get the TextView from the ViewHolder and then set the text (item name) and tag (item ID) valuesviewHolder.textViewItem.setText(objectItem.itemName);viewHolder.textViewItem.setTag(objectItem.itemId);}return convertView;}
第3步 :为了进行测试,我们将在ListView中放入数千个项目。 在MainActivity.java上,我们的showPopUp()现在看起来像这样:
public void showPopUp(){// we'll specify the number of items we want our ListView to have.int numberOfItems = 1000;// add your items, this can be done programatically// your items can be from a databaseObjectItem[] ObjectItemData = new ObjectItem[numberOfItems];// we'll use a for loop // created objects = number of items specified abovefor(int x=0; x<numberOfItems; x++){int sampleId = 90 + x;ObjectItemData[x] = new ObjectItem(sampleId, "Store # " + (x+1));}// our adapter instanceArrayAdapterItem adapter = new ArrayAdapterItem(this, R.layout.list_view_row_item, ObjectItemData);// create a new ListView, set the adapter and item click listenerListView listViewItems = new ListView(this);listViewItems.setAdapter(adapter);listViewItems.setOnItemClickListener(new OnItemClickListenerListViewItem());// put the ListView in the pop upalertDialogStores = new AlertDialog.Builder(MainActivity.this).setView(listViewItems).setTitle("Stores").show();}
我用多达2,000个项目测试了此代码,并且性能仍然非常出色。
下一步是什么?
如果您对此主题还有其他想法,请将其放在下面的评论部分。 我非常乐意更新这篇文章并改善人类生活。
在下一篇文章中,我们将尝试使用AsyncTask将图像加载到ListView中。 类似于Google Play商店应用的操作方式。
翻译自: https://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html
Android ViewHolder模式示例相关推荐
- viewholder_Android ViewHolder模式示例
viewholder 现在,我们将对Android ListView的平滑滚动进行编码. 在上一篇文章中 ,我们试图了解带适配器的ListView的工作方式. 这次,一切将与性能有关. 我之所以单独发 ...
- Android的viewHolder模式
深入浅出(这部分总结的非常好) ListView之BaseAdapter的基本使用以及ViewHolder模式. 话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用 ...
- Android指南针代码示例
今天,我将分享一个有效的代码,为您的android设备制作一个非常简单的罗盘应用程序. 某些android设备(例如Huawei Y300和Lenovo P700i)不完全支持运动传感器,因此该代码不 ...
- Android开发模式万佛朝中MVX(MVC、MVP、MVVM)
今天公司的测试服务器开小差了,后台被吐槽的体无完肤,虽然我们都知道跟他没有什么关系,但是生活需要乐趣,总要有人背锅,哈哈!~~~暂时没有环境开发了,那就分享一下之前做的一篇关于Android开发模式的 ...
- android策略模式_Android游戏开发–设计游戏实体–策略模式
android策略模式 在这一部分中,我将尝试解释我对好的游戏设计元素的理解. 我将在示例中使用droid,并编写基本的战斗模拟器脚本以查看其行为. 问题: 我指挥一个机器人,我想消灭敌人. 再次面对 ...
- android viewholder
ViewHolder不是Android的开发API,而是一种设计方法,就是设计个静态类,缓存一下,省得Listview更新的时候,还要重新操作. public View getView(in ...
- Android MVP模式 解析JSON 显示到ListView上
Android MVP模式 解析JSON 显示到ListView上 有关MVP模式的介绍,这里不作详细解释,稍后会更新MVP设计模式,请等待链接-- 简述本次的主要功能实现: 通过mvp设计模式,(M ...
- android mvp 利弊,android mvp模式有什么弊端 - 什么是android mvp模式,android mvp模式有什么弊端...
android mvp模式有什么弊端 才开始学习使用MVP时,看到大家说了很多MVP的优点,代码复用,条理清晰等等.不过我改下来发现,MVP在我看来,最大的优点还是代码解耦,逻辑清晰,至于代码复用,暂 ...
- android:沉浸模式_2020年电子商务技术趋势:沉浸式技术时代
android:沉浸模式 Technologies like AI, VR/AR, Cryptocurrency, IoT will take center stage in 2020 and als ...
最新文章
- mysql case 表达式
- 交换机工作原理、MAC地址表、路由器工作原理详解
- c语言 lis的nlogn算法,ACM竞赛高级算法讲义.doc
- Windows 2003 标准版_企业版_SP1_SP2_R2的区别
- hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集
- 《直播疑难杂症排查》之二:播放卡顿
- Android之JNI的使用
- 实例49:python
- 在线打开html文件,html是什么文件?html文件怎么打开?
- 前端2018年12月9日 前端开发路上的小白心得--励志当个领路人
- Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (10) - 乱序引擎概述
- CentOS6.4 配置mysql服务器启动多个端口,同步单表数据
- 一个html可以有几个h1,一个页面可以有多个H1标签吗?
- 天猫二面:内存耗尽后 Redis 会发生什么?
- 摸爬滚打半年,我是如何从小白进阶到渗透测试工程师
- 国际期刊出版趋势及科技论文写作要点
- ESP32彩屏显示入门(一):我要五彩斑斓的黑,还有五光十色的白 | ESP32轻松学(Arduino版)
- 【Python】详解pandas的isin索引和~反向索引
- win10在电脑中添加新用户
- 08.音频系统:第002节_Android音频系统框架简述
热门文章
- 重装XP系统后桌面图标有蓝色阴影的恢复方法--win10专业版
- 隐藏的宝藏,13个不可忽视的优秀 Python 库
- 怪物猎人世界计算机内存不足,《怪物猎人世界》吃CPU原因曝光 官方:加载内容过多...
- 抖音引流到微信的5个方法
- 关于传智书城QQ邮箱激活问题
- C++七倍龙珠(sevenbead)
- 网页是什么?HTML是什么?
- Watchdog机制原理
- 7月视频号直播热度榜来了,第一名单场直播热度超1500万!
- 杯子掉落计算机老师的解释,杯子掉落各科老师咋解释是什么梗 引发了网友的各种回忆杀...