现在,我们将对Android ListView的平滑滚动进行编码。 在上一篇文章中 ,我们试图了解带适配器的ListView的工作方式。 这次,一切将与性能有关。

我之所以单独发表这篇文章是因为有时很难理解Android ListView 。 我想到的是:“我们必须先做基础,然后再应用优化。”

ViewHolder模式是什么?

ViewHolder设计模式使您无需查找即可访问每个列表项视图,从而节省了宝贵的处理器周期。 具体来说,它避免了ListView滚动期间频繁调用findViewById()并使它变得平滑。

没有ViewHolder设计模式

好的,让我们深入研究一下,看看它在没有 ViewHolder模式的情况下如何工作。

让我们看看ArrayAdapterItem.java中以前的 getView()方法

  1. 第一次加载时,convertView为null。 我们将不得不增加列表项的布局,并通过findViewById()找到TextView。
  2. 第二次加载时,convertView不为null,很好! 我们不必再给它充气。 但是,我们将再次使用findViewById()。
  3. 在以下几次加载时,convertView绝对不是null。 但是findViewById()会不断地被调用,它将起作用,但是,它会降低性能,特别是如果ListView中有很多项目和视图时。

使用ViewHolder设计模式

现在,让我们看看它如何 ViewHolder模式一起使用。

  1. 第一次加载时,convertView为null。 我们必须膨胀列表项的布局,实例化ViewHolder,通过findViewById()找到TextView并将其分配给ViewHolder,然后将ViewHolder设置为convertView的标记。
  2. 第二次加载时,convertView不为null,很好! 我们不必再给它充气。 令人高兴的是,由于我们现在可以通过其ViewHolder访问TextView,因此不必调用findViewById()。
  3. 下次加载时,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商店应用的操作方式。

参考:来自我们的JCG合作伙伴 Mike Dalisay的Android ViewHolder模式示例,来自The Ninja博客。

翻译自: https://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html

Android ViewHolder模式示例相关推荐

  1. viewholder_Android ViewHolder模式示例

    viewholder 现在,我们将对Android ListView的平滑滚动进行编码. 在上一篇文章中 ,我们试图了解带适配器的ListView的工作方式. 这次,一切将与性能有关. 我之所以单独发 ...

  2. Android的viewHolder模式

    深入浅出(这部分总结的非常好) ListView之BaseAdapter的基本使用以及ViewHolder模式. 话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用 ...

  3. Android指南针代码示例

    今天,我将分享一个有效的代码,为您的android设备制作一个非常简单的罗盘应用程序. 某些android设备(例如Huawei Y300和Lenovo P700i)不完全支持运动传感器,因此该代码不 ...

  4. Android开发模式万佛朝中MVX(MVC、MVP、MVVM)

    今天公司的测试服务器开小差了,后台被吐槽的体无完肤,虽然我们都知道跟他没有什么关系,但是生活需要乐趣,总要有人背锅,哈哈!~~~暂时没有环境开发了,那就分享一下之前做的一篇关于Android开发模式的 ...

  5. android策略模式_Android游戏开发–设计游戏实体–策略模式

    android策略模式 在这一部分中,我将尝试解释我对好的游戏设计元素的理解. 我将在示例中使用droid,并编写基本的战斗模拟器脚本以查看其行为. 问题: 我指挥一个机器人,我想消灭敌人. 再次面对 ...

  6. android viewholder

    ViewHolder不是Android的开发API,而是一种设计方法,就是设计个静态类,缓存一下,省得Listview更新的时候,还要重新操作.      public View getView(in ...

  7. Android MVP模式 解析JSON 显示到ListView上

    Android MVP模式 解析JSON 显示到ListView上 有关MVP模式的介绍,这里不作详细解释,稍后会更新MVP设计模式,请等待链接-- 简述本次的主要功能实现: 通过mvp设计模式,(M ...

  8. android mvp 利弊,android mvp模式有什么弊端 - 什么是android mvp模式,android mvp模式有什么弊端...

    android mvp模式有什么弊端 才开始学习使用MVP时,看到大家说了很多MVP的优点,代码复用,条理清晰等等.不过我改下来发现,MVP在我看来,最大的优点还是代码解耦,逻辑清晰,至于代码复用,暂 ...

  9. android:沉浸模式_2020年电子商务技术趋势:沉浸式技术时代

    android:沉浸模式 Technologies like AI, VR/AR, Cryptocurrency, IoT will take center stage in 2020 and als ...

最新文章

  1. mysql case 表达式
  2. 交换机工作原理、MAC地址表、路由器工作原理详解
  3. c语言 lis的nlogn算法,ACM竞赛高级算法讲义.doc
  4. Windows 2003 标准版_企业版_SP1_SP2_R2的区别
  5. hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集
  6. 《直播疑难杂症排查》之二:播放卡顿
  7. Android之JNI的使用
  8. 实例49:python
  9. 在线打开html文件,html是什么文件?html文件怎么打开?
  10. 前端2018年12月9日 前端开发路上的小白心得--励志当个领路人
  11. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (10) - 乱序引擎概述
  12. CentOS6.4 配置mysql服务器启动多个端口,同步单表数据
  13. 一个html可以有几个h1,一个页面可以有多个H1标签吗?
  14. 天猫二面:内存耗尽后 Redis 会发生什么?
  15. 摸爬滚打半年,我是如何从小白进阶到渗透测试工程师
  16. 国际期刊出版趋势及科技论文写作要点
  17. ESP32彩屏显示入门(一):我要五彩斑斓的黑,还有五光十色的白 | ESP32轻松学(Arduino版)
  18. 【Python】详解pandas的isin索引和~反向索引
  19. win10在电脑中添加新用户
  20. 08.音频系统:第002节_Android音频系统框架简述

热门文章

  1. 重装XP系统后桌面图标有蓝色阴影的恢复方法--win10专业版
  2. 隐藏的宝藏,13个不可忽视的优秀 Python 库
  3. 怪物猎人世界计算机内存不足,《怪物猎人世界》吃CPU原因曝光 官方:加载内容过多...
  4. 抖音引流到微信的5个方法
  5. 关于传智书城QQ邮箱激活问题
  6. C++七倍龙珠(sevenbead)
  7. 网页是什么?HTML是什么?
  8. Watchdog机制原理
  9. 7月视频号直播热度榜来了,第一名单场直播热度超1500万!
  10. 杯子掉落计算机老师的解释,杯子掉落各科老师咋解释是什么梗 引发了网友的各种回忆杀...