BaseAdapter 使用和优化详析

来源:互联网 发布:淘宝店家骂人怎么办 编辑:程序博客网 时间:2024/06/15 21:08

准备工作

LayoutInflater 实例化视图填充器对象

LayoutInflater viewInflater = LayoutInflater.from(content);

content 要使用当前 activity 中的 content

BaseAdapter 基本结构

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

ViewHolder 优化 BaseAdapter 思路

  1. 创建 View 显示数据的 Bean 对象,用于封装数据

  2. 在构造方法中初始化用于映射的数据 collection

  3. 创建 ViewHolder,创建 ListView 中每个 item 的布局 view 中的子控件 view 的对应映射关系

  4. 判断 convertView,为 null 则使用视图填充器 LayoutInflater 加载 item 布局,在使用 findViewById 找到子控件,赋值给创建的 ViewHolder 对象。并使用 convertView 的 setTag() 方法把 ViewHolder 设置到 View 的 tag 属性中。若不为 null,则通过 convertView 的 getTag() 方法取出 ViewHolder

  5. 把数据 Bean 中的数据给 ViewHolder 中的属性(每个 item 的子控件)设置数据

public class MyAdapter extends BaseAdapter {    private LayoutInflater mLayoutInflater;    // 映射数据    private List<ItemBean> mDataList;    private long mSumTime;    public MyAdapter(Context context, List<ItemBean> list) {        mLayoutInflater = LayoutInflater.from(context);        mDataList = list;    }    // 获取数据量    @Override    public int getCount() {        return mDataList.size();    }    // 获取对应ID项对应的Item    @Override    public Object getItem(int position) {        return mDataList.get(position);    }    // 获取对应项ID    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        View tempView = null;        // 最差        tempView = low(position);        // 普通        tempView = middle(position, convertView);        // 最优        tempView = high(position, convertView);        return tempView;    }    private View high(int position, View convertView) {        ViewHolder holder = null;        if (convertView == null) {            holder = new ViewHolder();            // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null            convertView = mLayoutInflater.inflate(R.layout.item, null);            holder.img = (ImageView) convertView.findViewById(R.id.iv_image);            holder.title = (TextView) convertView.findViewById(R.id.tv_title);            holder.content = (TextView) convertView.findViewById(R.id.tv_content);            convertView.setTag(holder);        } else {            holder = (ViewHolder) convertView.getTag();        }        // 取出bean对象        ItemBean bean = mDataList.get(position);        // 设置控件的数据        holder.img.setImageResource(bean.itemImageResid);        holder.title.setText(bean.itemTitle);        holder.content.setText(bean.itemContent);        return convertView;    }    private View middle(int position, View convertView) {        if (convertView == null) {            // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null            convertView = mLayoutInflater.inflate(R.layout.item, null);        }        ImageView itemImage = (ImageView) convertView.findViewById(R.id.iv_image);        TextView itemTitle = (TextView) convertView.findViewById(R.id.tv_title);        TextView itemContent = (TextView) convertView.findViewById(R.id.tv_content);        // 取出bean对象        ItemBean bean = mDataList.get(position);        // 设置控件的数据        itemImage.setImageResource(bean.itemImageResid);        itemTitle.setText(bean.itemTitle);        itemContent.setText(bean.itemContent);        return convertView;    }    private View low(int position) {        // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null        View view = mLayoutInflater.inflate(R.layout.item, null);        // 实例化控件        ImageView itemImage = (ImageView) view.findViewById(R.id.iv_image);        TextView itemTitle = (TextView) view.findViewById(R.id.tv_title);        TextView itemContent = (TextView) view.findViewById(R.id.tv_content);        // 取出bean对象        ItemBean bean = mDataList.get(position);        // 设置控件的数据        itemImage.setImageResource(bean.itemImageResid);        itemTitle.setText(bean.itemTitle);        itemContent.setText(bean.itemContent);        return view;    }    public static class ItemBean {        public int itemImageResid;        public String itemTitle;        public String itemContent;        public ItemBean(int itemImageResid, String itemTitle, String itemContent) {            this.itemImageResid = itemImageResid;            this.itemTitle = itemTitle;            this.itemContent = itemContent;        }    }    // ViewHolder用于缓存控件    class ViewHolder {        public ImageView img;        public TextView title;        public TextView content;    }}

总结

listview的优化通过convertView来减少布局的加载,通过ViewHolder来减少findViewById的性能消耗。

0 0
原创粉丝点击