Android学习笔记————提高列表的流畅性
来源:互联网 发布:电子琴知乎 编辑:程序博客网 时间:2024/04/28 08:59
本文来自本人Android学习的体会和总结,转载请申明出处:http://blog.csdn.net/chenshaoyang0011
Android平台中,列表是使用最频繁的组件之一,列表设计的好坏能够直接影响用户的体验。试想,如果你在滑动一个ListView的时候总是感到卡顿,你一定会觉得这个应用是个再糟糕不过的应用了。
那么今天我们就来讨论下,如何使列表更加的流畅性?本文参考自:http://developer.android.com/training/improving-layouts/smooth-scrolling.html#
好了,言归正传。为了打到优化的目的,我们可以通过:重复利用资源来打到我们的目的
首先,我们需要明白一个事实,在列表中(如ListView,GridView等)中,显示多个item,而且通常情况下,每个item的布局是一样的。这里就牵扯到我们讨论的问题,重复利用资源。想要打到这个目的,我们首先需要明白Android中用于列表中的适配器(Adapter)是如何工作的,如,SimpleAdapter,CursorAdapter,ArrayAdapter这些都是系统为我们设计好的,当然也是优化过的。但通常我们需要使用自己设计的适配器,关于适配器的使用,可以参考逼人的另外一篇笔记:http://blog.csdn.net/chenshaoyang0011/article/details/6978036,这里就不再赘述了。
列表中最需要回收的资源是什么?当然是Item中共同拥有的或具有非常相似的东西,这其中最常见的当然是View了(用于显示每个item的容器)。如果我们为每个Item都创建自己的View,势必会消耗更多的资源,此时我们不妨利用前面不用的View,来显示自己的内容。而Adapter中与View直接相关的方法就是getView了,其中有三个参数,分别是
int position 当前item的位置(从0起)
View convertView用于回收利用的View,如果没有就为null
ViewGroup parent当前View所属的父View
那么,我们现在需要了解的是convertView是如何用于回收的呢?
当列表第一次被创建的时候,所有的convertView 都是null
当我们滑动列表时,我们就会将不再显示的item进行回收,用与创建那些需要显示的item。
注意,只有当item彻底离开屏幕才会将其回收。
这样,我们知道convertView是如何被回收的,接下来的事就是按照这个思路写code啦。下面就是一个简单的demo,演示一种可供使用的回收方式。
public class MyAdapter extends BaseAdapter { private Context mContext; private LayoutInflater inflater; private List<Integer> ls = new ArrayList<Integer>(); public MyAdapter(Context context,List<Integer> list){ this.mContext = context; inflater = LayoutInflater.from(context); ls = list; } @Override public int getCount() { return (ls == null)? 0: ls.size(); } @Override public Object getItem(int arg0) { return (ls == null) ? null : ls.get(arg0); } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null){ convertView = inflater.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.tv = (TextView)convertView.findViewById(R.id.textView); //通过setTag,将其交给convertView,并通过convertView“邮寄”给需要的item convertView.setTag(holder); }else{ //收到邮件,拿来自己用 holder = (ViewHolder)convertView.getTag(); } holder.tv.setText(ls.get(position) + ""); return convertView; } /** * 这个类用于持有item中拥有的子View, * 以及其他可以传递的具有共性的东西 */ static class ViewHolder{ TextView tv; }}代码很简单,只需要注意ViewHolder的使用就可以啦。
那么至此,我们就能够通过回收View来优化列表啦。
如有错误,欢迎指正~
- Android学习笔记————提高列表的流畅性
- Android菜鸟的成长笔记——RadioGroup + ViewPager 联动时,ViewPager滑动不流畅
- 流畅的python学习笔记
- android 列表倒计时流畅的完美实现
- webservice学习笔记——提高篇
- webservice学习笔记——提高篇
- webservice学习笔记——提高篇
- webservice学习笔记——提高篇
- Android学习笔记(23):列表项的容器—AdapterView的子类们
- #提高Android Studio流畅度
- Android提高UI流畅度
- 提高Android studio流畅度
- 《流畅的Python》第一章学习笔记
- Android OpenGLES2.0(十三)——流畅的播放逐帧动画
- Android进阶#(3/12)保证APP流畅的关键因素——多线程_Android中的多线程
- 【MIG专项测试组】如何量化Android应用的“卡”?—流畅度原理&定义篇
- python学习笔记5—序列与列表的操作
- 学习笔记2——建立列表
- ACM 第一天 大数运算
- ruby线程同步控制
- 留住幸福的办法是不断创造幸福
- hdu1575 矩阵乘法
- hdu 1757 A Simple Math Problem 矩阵乘法解线性方程
- Android学习笔记————提高列表的流畅性
- 趣题8:最小长度珠子
- poj1681 Painter's Problem 高斯消元
- hdu3809 Decrypt coordinate 迭代法
- poj3111K Best迭代法
- SQL SEVER 概述 和 基础
- hdu3400 Line belt 三分法
- ADS1.2出现erro starting external process,Process error code 87(0x57)参数错误
- Irrlicht引擎源码剖析——第五天