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是否有缓存,没缓存就构造ViewHolder
public 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
原创粉丝点击