BaseAdapter的使用与优化

来源:互联网 发布:python file readline 编辑:程序博客网 时间:2024/05/21 19:34

BaseAdapter的使用与优化

本文是基于慕课网eclipse_xu老师讲解
Android必学-BaseAdapter的使用与优化
,自己做的整理笔记,在此感谢老师和慕课网的分享,视频链接如下: http://www.imooc.com/learn/365

标签(空格分隔): BaseAdapter Android 慕课网

  • BaseAdapter的使用与优化
    • ListView的缓存机制
    • BaseAdapter的逗比式
    • BaseAdapter普通式
    • BaseAdapter文艺式


数据适配器模式的应用:
1. 降低程序耦合性
2.容易扩展

1.ListView的缓存机制

需要才显示,显示完就被会受到缓存

2.BaseAdapter的逗比式

  • BaseAdapter基本结构
    • public int getCount() : 适配器中数据集中数据的个数
    • public Object getItem(int position) : 获取数据集中与指定索引对应的数据项
    • public long getItemId(int position) : 获取指定行对应的ID
    • public View getView(int position,View convertView,ViewGroup parent) : 获取每一个Item的显示内容

ItemBean.java

package com.excavator.baseadapter;/** * 项目名称:BaseAdapter * 类描述: * 创建人:admin * 创建时间:2015/5/14 21:13 * 修改人:admin * 修改时间:2015/5/14 21:13 * 修改备注: */public class ItemBean {    public int ItemImageResid;    public String ItemTitle;    public String ItemContent;    public ItemBean(int itemImageResid, String itemTitle, String itemContent) {        ItemImageResid = itemImageResid;        ItemTitle = itemTitle;        ItemContent = itemContent;    }}

MainActivity.java:

package com.excavator.baseadapter;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        List<ItemBean> itemBeanList = new ArrayList<>();        for (int i=0;i<20;i++){            itemBeanList.add(new ItemBean(                    R.mipmap.ic_launcher,                    "我是标题"+i,                    "我是内容"+i));        }        ListView listView = (ListView) findViewById(R.id.lv_main);        listView.setAdapter(new MyAdapter(this,itemBeanList));    }}

MyAdapter.java:

package com.excavator.baseadapter;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;/** * 项目名称:BaseAdapter * 类描述: * 创建人:admin * 创建时间:2015/5/14 21:21 * 修改人:admin * 修改时间:2015/5/14 21:21 * 修改备注: */public class MyAdapter extends BaseAdapter {    private List<ItemBean> mList;    private LayoutInflater mInflater;    //数据源与适配器关联    public MyAdapter(Context context,List<ItemBean> list) {        mList = list;        //context : 要使用当前Adapter的界面对象        //mInflater :布局加载器对象        mInflater = LayoutInflater.from(context);    }    @Override    public int getCount() {        return mList.size();    }    @Override    public Object getItem(int position) {        return mList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    //返回每一项的现实内容    @Override    public View getView(int position, View convertView, ViewGroup parent) {        //逗比式 没有任何优化处理,每次都创建新的View,设置控件 效率极其低下        View view = mInflater.inflate(R.layout.item, null);        ImageView imageView = (ImageView) view.findViewById(R.id.iv_image);        TextView title = (TextView) view.findViewById(R.id.tv_title);        TextView content = (TextView) view.findViewById(R.id.tv_content);        ItemBean bean = mList.get(position);        imageView.setImageResource(bean.ItemImageResid);        title.setText(bean.ItemTitle);        content.setText(bean.ItemContent);        return view;    }}

3.BaseAdapter普通式

//普通式 利用了ListView的缓存特性,如果没有缓存才创建新的View 但findViewById依然会浪费大量时间        if (convertView==null) {            convertView = mInflater.inflate(R.layout.item, null);        }        ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_image);        TextView title = (TextView) convertView.findViewById(R.id.tv_title);        TextView content = (TextView) convertView.findViewById(R.id.tv_content);        ItemBean bean = mList.get(position);        imageView.setImageResource(bean.ItemImageResid);        title.setText(bean.ItemTitle);        content.setText(bean.ItemContent);        return convertView;

4.BaseAdapter文艺式

创建内部类ViewHolder

//创建内部类ViewHolder    class ViewHolder  {        public ImageView imageView;        public TextView title;        public TextView content;    }
        //文艺式 不仅利用了ListView的缓冲,更通过ViewHolder类来实现显示数据的视图的缓存,避免多次通过findViewById寻找控件        ViewHolder viewHolder;        //判断convertView是否为空        if (convertView==null) {            viewHolder = new ViewHolder();            convertView = mInflater.inflate(R.layout.item, null);            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_image);            viewHolder.title = (TextView) convertView.findViewById(R.id.tv_title);            viewHolder.content = (TextView) convertView.findViewById(R.id.tv_content);            //通过setTag将ViewHolder与convertView绑定            convertView.setTag(viewHolder);        }else {            viewHolder = (ViewHolder) convertView.getTag();        }        ItemBean bean = mList.get(position);        viewHolder.imageView.setImageResource(bean.ItemImageResid);        viewHolder.title.setText(bean.ItemTitle);        viewHolder.content.setText(bean.ItemContent);        return convertView;

总结:
ViewHolder优化BaseAdapter思路

  • 创建Bean对象,用于封装数据
  • 在构造方法中初始化用于映射的数据List
  • 创建ViewHolder类,创建布局映射关系
  • 判断convertView,为空则创建,并设置Tag,否则通过Tag来取出ViewHolder
  • 给ViewHolder中的控件设置数据
0 0
原创粉丝点击