软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 移动开发 -> listview中的adapter学习小结 -> 正文阅读
移动开发 最新文章
深入了解android中的消息机制Handler
Android
Libgdx之BitmapFont字体
AndroidApp发布到应用市场的流程
Android开发找工作之前先看看这些知识点吧
View的事件分发机制解析
简单介绍了解白鹭引擎Egret
Cocos2d
android获取本地图片(二)
动画特效七:碰撞动画

[移动开发]listview中的adapter学习小结

  2016-04-03 20:41:38

概述


Adapter是数据和UI之间的一个桥梁,在listview,gridview等控件中都会使用到,android给我们提拱了4个adapte供我们使用:
  • BaseAdapter是一个抽象类,继承它需要实现较多的方法
  • ArrayAdapter支持泛型操作,最为简单,只能展示一行字
  • SimpleAdapter有最好的扩充性,可以自定义出各种效果
  • SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来

在实际项目中往往用的最多的还是BaseAdapter,系统提供的几个adapter大多数只有在写demo才为了图省事去用一下而已,这在包建强的《app研发录》中的也有所体现,第一章介绍adapter时就提到要求所有adpater继承自BaseAdapter,从构造函数List<自定义实体>这样的数据集合,从而完成ListView的填充工作,本篇主要总结一下BaseAdapter.

传统的方式


基本的一般只需要4步即可完成
  • 继承BaseAdapter
  • 实现getCountgetItemgetItemIdgetView
  • 书写ViewHolder内部类去存储复用View
  • getView中实现数据的设置
    下面给出一个基本的NormalAdapter实现的代码
public class NormalAdapter extends BaseAdapter {
    private LayoutInflater layoutInflater;
    private List<TestBean> datas;

    //NormalAdapter需要一个Context,通过Context获得Layout.inflater,然后通过inflater加载item的布局
    public NormalAdapter(Context context, List<TestBean> datas) {
        layoutInflater = LayoutInflater.from(context);
        this.datas = datas;
    }

    @Override
    public int getCount() {
        return datas.size();
    }

    @Override
    public Object getItem(int position) {
        return datas.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) {
            convertView = layoutInflater.inflate(R.layout.item_list, parent, false);
            holder = new ViewHolder();

            holder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);
            holder.tv_des = (TextView) convertView.findViewById(R.id.tv_desc);
            holder.tv_time = (TextView) convertView.findViewById(R.id.tv_time);
            holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);

            convertView.setTag(holder);
        } else {
            //说明convertview已经被复用,已经设置过tag
            holder = (ViewHolder) convertView.getTag();
        }

        TestBean testBean = datas.get(position);
        holder.tv_title.setText(testBean.getTitle());
        holder.tv_des.setText(testBean.getDesc());
        holder.tv_time.setText(testBean.getTime());
        holder.tv_name.setText(testBean.getName());

        return convertView;
    }

    /**
     * viewHoder服务于特定的Adapter,根据对应的item_layout书写
     */
    private static class ViewHolder {
        TextView tv_title;
        TextView tv_des;
        TextView tv_time;
        TextView tv_name;

    }
}

初步封装


这样会带来一些问题,一个listview就要对应一个adpater,还要对应一个viewholder,这里有很多冗余的代码如getCountgetItemgetItemId这些可以被抽象出来,其实封装的思路很简单,主要集中在getView这个方法上,通过分析最普通的NormalAdapter可以看出,getView主要完成三个部分
  • 根据convertView是否为空来生成对应的holder
  • 根据对应的convertView来设置其控件上的数据

  • 返回convertView
    这三部分主要封装在BaseholderTool中

  • BaseAdapterTool
    BaseAdapterTool比较简单就是继承BaseAdapter重写几种方法在getView中使用BaseViewHolderTool
    关键代码如下
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //使用通用vierholder
        BaseViewHolderTool holder = BaseViewHolderTool.get(context, convertView, parent, layoutId, position);
        convert(holder, getItem(position));
        return holder.getBaseConvertView();
    }

    /**
     * 将该方法公布出去
     *
     * @param holder
     * @param t
     */
    public abstract void convert(BaseViewHolderTool holder, T t);
  • BaseviewHolderTool
    用来封装viewHolder,从基本的NormalAdapter可以看出,viewholder就是相当于一个缓存,根据convertView来判断是否重用holder;而convertView就是listview每个item的布局,因此需要完成解析布局的功能,这里采用更加高效的SparseArray
    代替hashmap(android推荐);holder又要肩负着获取布局控件的使命因此又要暴露出对应的方法
public class BaseViewHolderTool {
    private SparseArray<View> views;
    private int basePosition;
    private View baseConvertView;

    public BaseViewHolderTool(Context context, ViewGroup parent, int layoutId, int position) {

        this.basePosition = position;
        this.views = new SparseArray<View>();

        baseConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        baseConvertView.setTag(this);
    }

    /**
     * 获得convertview不同情况的holder
     *
     * @param context
     * @param convertView
     * @param parent
     * @param layoutId
     * @param position
     * @return
     */
    public static BaseViewHolderTool get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
        if (convertView == null) {
            return new BaseViewHolderTool(context, parent, layoutId, position);
        } else {
            BaseViewHolderTool holder = (BaseViewHolderTool) convertView.getTag();
            holder.basePosition = position;//更新position位置
            return holder;
        }
    }

    /**
     * 通过id获取控件
     *
     * @param viewId
     * @param <T>
     * @return
     */
    public <T extends View> T getView(int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = baseConvertView.findViewById(viewId);
            views.put(viewId, view);
        }
        return (T) view;
    }

    public View getBaseConvertView() {
        return baseConvertView;
    }
}

效果图如下:

多个type的item


这里要谈的是多个布局同时出现在一个listview中,
这时候就需要
重写 getViewTypeCount() – 返回你有多少个不同的布局
重写 getItemViewType(int) – 由position返回view type id
然后在getview中,
int viewType = getItemViewType(position);//获取对应的类型

这里做了一个简单地demo在偶数行显示item_list2,奇数行显示item_list
  @Override
    public int getItemViewType(int position) {
        return position % 2 == 0 ? TYPE_SEPARATOR : TYPE_MAIN;
    }

效果图如下

demo已经传到github上AdapterStudy
上一篇文章      下一篇文章      查看所有文章
2016-04-03 20:41:06  
360图书馆 论文大全 母婴/育儿 软件开发资料 网页快照 文字转语音 购物精选 软件 美食菜谱 新闻中心 电影下载 小游戏 Chinese Culture
生肖星座解梦 三沣玩客 拍拍 视频 开发 Android开发 站长 古典小说 网文精选 搜图网 天下美图 中国文化英文 多播视频 装修知识库
2017-1-20 11:49:02
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --