Android中优化ListView的ViewHolder模式
2016-03-07 21:43
423 查看
使用Adapter填充ListView中数据的时候,getView方法每次都会调用findViewById的方法来实例化每个item中的组件。也就是说,ListView中有多少个item,item里面的组件就会被实例化多少次。这明显会增加ListView的内存占用。而使用ViewHolder来优化adapter可以大大提高ListView的效率。
使用ListView也很简单,只要在自定义的Adapter中,定义一个内部类ViewHolder,然后把cell中出现的组件作为其成员变量就可以了。一个具体的adapter例子的代码如下所示。
然后,我们就可以通过Adapter的构造方法,来填充自己的数据
这样,就可以实现ListView的效果了。
效果图:
源码: https://github.com/futureshine/ViewHolderAdapter
使用ListView也很简单,只要在自定义的Adapter中,定义一个内部类ViewHolder,然后把cell中出现的组件作为其成员变量就可以了。一个具体的adapter例子的代码如下所示。
package com.eeyes.ViewHolderAdapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; import java.util.Map; /** * Created by guolei on 2016/3/6. */ public class ViewHolderAdapter extends BaseAdapter { /**用来填充的内容**/ private List<String> mTitleData; private List<String> mContentData; private List<Integer> mResId; private LayoutInflater mInflater; public ViewHolderAdapter(Context context, List<Integer> resId, List<String> titleData, List<String> contentData){ this.mResId = resId; this.mTitleData = titleData; this.mContentData = contentData; mInflater = LayoutInflater.from(context); } @Override public int getCount() { return mTitleData.size(); } @Override public Object getItem(int position) { return mTitleData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null){ holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.test_layout, null); holder.titleTextView = (TextView) convertView.findViewById(R.id.title); holder.contentTextView = (TextView) convertView.findViewById(R.id.content); holder.imageView = (ImageView) convertView.findViewById(R.id.image); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.contentTextView.setText(mContentData.get(position)); holder.titleTextView.setText(mTitleData.get(position)); holder.imageView.setImageResource(mResId.get(position)); return convertView; } public final class ViewHolder{ public ImageView imageView; public TextView titleTextView; public TextView contentTextView; } }
然后,我们就可以通过Adapter的构造方法,来填充自己的数据
adapter = new ViewHolderAdapter(this, mResId, mTitleData, mContentData);
这样,就可以实现ListView的效果了。
效果图:
源码: https://github.com/futureshine/ViewHolderAdapter
相关文章推荐
- Android Fragment完全解析
- Android高效加载大图、多图解决方案,有效避免程序OOM
- Please use Android Tools > Fix Project Properties.
- Android学习笔记之LinearLayout
- [android] android下创建一个sqlite数据库
- Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析
- Android 数据持久化
- 动态文字排版(GridView与ArrayAdapter)
- Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?
- Androidstudio学习初步问题
- android 05
- android开源库android-gif-drawable的使用
- Android开发中使用AndroidStudio与Eclipse的代码区别----自定义控件时自定义属性
- Android Studio 告诉你名字,自己修改快捷键
- 后台程序运行进度提示(ProgressBar与Handle的整合应用)
- android studio versionName一直都是1.0的解决办法
- Android Studio导入github下载的project和module的正确姿势
- Android群英传(2)——Android四大组件五大布局
- Android Hot Fix 小试
- Android Fragment