Android开发:优化ListView实践解析
作者:本站整理 时间:2016-03-31
在日常编程开发时,大家有没有遇到与优化ListView相关的问题呢?大家又会如何处理呢?在自己思考的同时,也可以来看看由优优软件下载站收集、编辑的相关文章,希望能给到来的朋友提供建议或更好的解决方案,闲话不多说,一起来进入正题吧!
在看了一些vogella的文章之后,发现关于android listview性能优化这一段很有意思,于是实践了一下,经过优化,性能确实提升不少!
先看看优化前和优化后的比较:
优化前的log截图:
优化后的log截图:
并且,在不停滚动ListView的过程中,优化之前会出现ANR现象,在AVD上特别容易复现:
然后,优化后显得很流畅,附上对于的log截图:
下面附上相关代码分析:
ListView中的每一个Item由一个ImageView 和一个TextView组成
Layout:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="horizontal" >
- <ImageView android:id="@+id/imageView"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent" />"
- <TextView android:id="@+id/textView"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_marginLeft="15dp"
- android:gravity="center_vertical" />
- </LinearLayout>
Activity继承自ListActivity,我故意增加了Item,方便测试,效果更明显:
- public class ListViewDemo extends ListActivity{
- private final String[] mItems = new String[] { "Android", "iPhone",
- "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ListViewArrayAdapter adapter = new ListViewArrayAdapter(this, mItems);
- getListView().setAdapter(adapter);
- }
- }
然后custom Adapter,优化之前的adapter:
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- long start = System.currentTimeMillis();
- LayoutInflater inflater = (LayoutInflater) mContext.getLayoutInflater();
- View rowView = inflater.inflate(mViewResourceId, parent, false);
- TextView textView = (TextView) rowView
- .findViewById(mTextViewResourceId);
- ImageView imageView = (ImageView) rowView
- .findViewById(mImageViewResourceId);
- textView.setText(mNames[position]);
- String s = mNames[position];
- if (s.startsWith("Windows7") || s.startsWith("iPhone")) {
- imageView.setImageResource(R.drawable.no);
- } else {
- imageView.setImageResource(R.drawable.yes);
- }
- Log.v("jerikc","cost time = " + (System.currentTimeMillis() - start));
- return rowView;
- }
优化之后的Adapter:
- public class ListViewArrayAdapter extends ArrayAdapter<String>{
- private final Activity mContext;
- private final String[] mNames;
- private final static int mViewResourceId = R.layout.text_image_row_layout;
- private final static int mTextViewResourceId = R.id.textView;
- private final static int mImageViewResourceId = R.id.imageView;
- static class ViewHolder {
- public TextView text;
- public ImageView image;
- }
- public ListViewArrayAdapter(Activity context, String[] names) {
- super(context, mViewResourceId, names);
- this.mContext = context;
- this.mNames = names;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- long start = System.currentTimeMillis();
- View rowView = convertView;
- if (rowView == null) {
- LayoutInflater inflater = mContext.getLayoutInflater();
- rowView = inflater.inflate(mViewResourceId, null);
- ViewHolder viewHolder = new ViewHolder();
- viewHolder.text = (TextView) rowView.findViewById(mTextViewResourceId);
- viewHolder.image = (ImageView) rowView.findViewById(mImageViewResourceId);
- rowView.setTag(viewHolder);
- }
- ViewHolder holder = (ViewHolder) rowView.getTag();
- String s = mNames[position];
- holder.text.setText(s);
- if (s.startsWith("Windows7") || s.startsWith("iPhone")) {
- holder.image.setImageResource(R.drawable.no);
- } else {
- holder.image.setImageResource(R.drawable.yes);
- }
- Log.v("jerikc","cost time = " + (System.currentTimeMillis() - start));
- return rowView;
- }
- }
优化的大致思想就是:优化之前,每次加载item的时候,都要加载一下布局文件,然后生成一个新的row View对象,然后通过View找到对应的ImageView和TextView,正如我们所知道的那样,加载布局文件时很耗时的,特别是在操作比较频繁 情况下,这是不可忍受的,所以会导致ANR现象。
因此,我们可以重复利用已不可见的row View对象。Android中,当它决定让row View对象不可见的时候,它允许通过getView方法中的convertView参数来重复利用刚刚不可见的row View对象。
在优化的过程中,第一次加载的时候,我们需要把相关的数据保存起来,而View有一个方法setTag,该方法可用来保存一些数据结构。我们一个row View对象是由ImageView和TextView空间组成的,因此定义一个ViewHolder来保存ImageView和TextView对象。 在重复利用的过程中,只需简单修改它们的值,而不用再次findViewById。
今天的教程文章就到这了,希望这篇XXX的教程对大家有所帮助。还需要了解相关内容的伙伴,要经常关注本站的新动态哦。除了文章外,本站还有许多安全、方便、绿色的手机软件可供免费下载,谢谢大家的支持了。【优优软件下载站】
相关文章
相关推荐
-
金山词霸个人版官方版
-
电脑键盘锁官方版 v1.0.7
-
SuperTV 5.55.33(视频播放器)
-
杏雨梨云USB维护系统2017丁酉版
-
久久客会员卡管理系统 5.11.09.2官方版(会员管理)
-
新星WMV视频格式转换器 7.2.2.0(视频格式转换工具)
-
伪原创工具 2.0.1.10(伪原创文章生成器)
-
虎牙直播助手官方版 v1.1.1.0
-
Everything官方安装版 V1.4.1.1002
-
乐易佳数据恢复 5.1.0个人版(数据恢复)
-
网易CC语音 3.16.4(多人语音工具)
-
写作猫 V1.0.6官方版(写作工具)
-
快乐女人好帮手绿色版 V5.22.524
-
CAD迷你家装 V8.0官方版(室内设计软件)
-
Combofix 15.4.1.1(程序删除软件)
-
新毒霸垃圾清理 V2014.9.28.11133(系统检测工具)独