ListView优化
来源:互联网 发布:淘宝客文案 编辑:程序博客网 时间:2024/05/22 15:52
一、Adapter优化
ListView加载数据在public View getView(int position, View convertView, ViewGroup parent) {}方法中进行的
1、利用了ListView的缓存特性ListView中的View需要时才显示,显示完就被回收到缓冲池中。利用了ListView的缓存特性,先判断convertView是否为空,不为空则表示已经加载过了存在于缓冲池中,从View缓冲池中取出,并重新设置好该view所要显示的数据;若没有缓存才创建新的View。
2利用ViewHolder模式提高效率每次调用getView() 中的findViewById()会浪费大量时间; ViewHolder模式避免了每次在调用getView()的时候都去通过findVIewById()实例控件。使用ViewHolder模式来优化ListView,只需要在自定义Adapter中定义一个内部类ViewHolder ,并将布局中的控件作为成员变量。代码如下:public View getView( int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null ) { holder=new ViewHolder(); convertView=mInflater.inflate(R.layout.item,null); holder.imageView = (ImageView) convertView.findViewById(R.id.image); holder.name = (TextView) convertView.findViewById(R.id.name); holder.content = (TextView) convertView.findViewById(R.id.content); holder.time = (TextView) convertView.findViewById(R.id.time); convertView.setTag(holder); } else { holder= (ViewHolder) convertView.getTag(); } ItemBean bean=mData .get(position); holder.imageView .setImageResource(bean.getImageId()); holder.name.setText(bean.getName()); holder.content .setText(bean.getContent()); holder.time.setText(bean.getTime()); return convertView;}class ViewHolder{ public ImageView imageView ; public TextView name ; public TextView content ; public TextView time ;}
二、打造通用适配器
1、封装ViewHolder
通用ViewHolder编写,封装一个新的可通用的ViewHolder。新建一个ViewHolder类,使用SparseArray<View>来存储控件。在ViewHolder中我们要完成之前的这部分代码的相同功能if (convertView == null ) { holder=new ViewHolder(); convertView=mInflater.inflate(R.layout.item,null); holder.imageView = (ImageView) convertView.findViewById(R.id.image); holder.name = (TextView) convertView.findViewById(R.id.name); holder.content = (TextView) convertView.findViewById(R.id.content); holder.time = (TextView) convertView.findViewById(R.id.time); convertView.setTag(holder); } else { holder= (ViewHolder) convertView.getTag(); }1、写一个可以在Adapter中返回ViewHolder 的方法。先判断convertView是否有缓存,没缓存就构造ViewHolderpublic static ViewHolder get( Context context,View convertView, ViewGroup parent,int ResourseId, int position){ if(convertView==null ){ return new ViewHolder(context,parent,ResourseId,position); } else { return (ViewHolder) convertView.getTag(); }}2、重写ViewHolder的构造方法public ViewHolder(Context context, ViewGroup parent, int ResourseId, int position){ this.mPosition =position; mViews=new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(ResourseId,parent, false); mConvertView .setTag(this);}3、获取控件对象public < T extends View> T getView(int viewId){ View view=mViews .get(viewId); if(view==null ){ view=mConvertView .findViewById(viewId); mViews .put(viewId,view); } return (T) view;}检验成果,与Adapter相结合,将getView()方法重写为public View getView( int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.get( context, convertView, parent, R.layout. item, position); ItemBean bean = mData .get(position); ImageView image = holder.getView(R.id.image); TextView name = holder.getView(R.id.name); TextView content = holder.getView(R.id.content); TextView time = holder.getView(R.id.time); image.setImageResource(bean.getImageId()); name.setText(bean.getName()); content.setText(bean.getContent()); time.setText(bean.getTime()); return holder.getmConvertView();}
2、通用Adapter编写写一个CommonAdapter类,继承BaseAdapter,将重复的部分封装起来,因为要适用不同的数据类型这里用到了泛型。getView()的方法每个实现类都不一样所以将它封装成一个Abstract的抽象方法共子类实现。因为父类成员需要被子类成员访问所以将其申明为protected.<pre name="code" class="java">public abstract class CommonAdapter<T > extends BaseAdapter { protected Context context ; protected List<T > mData; protected LayoutInflater mInflater ; public CommonAdapter(Context context, List<T > mData) { this .context = context; this .mData = mData; mInflater =LayoutInflater.from(context); } public int getCount() { return mData.size(); } public Object getItem(int position) { return mData.get(position); } public long getItemId(int position) { return position; } public abstract View getView(int position, View convertView, ViewGroup parent) ;}
0 0
- ListView优化
- listView优化
- ListView优化
- ListView优化
- ListView优化
- ListView优化
- listView优化
- listview 优化
- ListView优化
- listView优化
- ListView 优化
- ListVIew优化
- ListView优化
- ListView优化
- listview优化
- Listview 优化
- ListView优化
- ListView 优化
- sublime text 3.0 安装 HTML-CSS-JS Prettify
- python进行聚类(scikit-lean、scipy)
- android文件系统区分大小写的问题
- 2016年8月15号
- Ekka Dokka
- ListView优化
- 把子类当成父对象使用(子类赋值给父类)
- thinkphp3.2的运用
- cocos2dx 3.2 内存管理
- bzoj2144 跳跳棋 二分+lca
- STL之list容器
- 仿Android 5.0按钮点击效果
- 孩子们的游戏(圆圈中最后剩下的数)
- C语言人物背包属性0815