博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
慕课网 万能适配器学习笔记
阅读量:6431 次
发布时间:2019-06-23

本文共 6497 字,大约阅读时间需要 21 分钟。

  hot3.png

首先再次感谢 慕课网的技术大牛分享了该课程。

一.传统 ListView 适配器的模式:1. 创建Listview,并为listview 创建item布局2.封装数据 3.为Item布局创建特定的适配器 用于数据展示。(在这过程中,如果某一个ListView 的item中控件过多,控件的生命及调用会导致代码量上升,而如果一个app中有很多个地方需要用到ListView 时,需要分别写多个适配器,会导致很多重复性的操作,为了避免这种情况的发生,让编码更轻松,可参考 慕课网Android万能适配器 的编写。)。

传统Adapter 编码风格如下:

package com.imooc.imooc_adapter;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class MyAdapter extends BaseAdapter {    private Context context;    private List
 mlist;    public MyAdapter(Context context, List
 mlist) {        super();        this.context = context;        this.mlist = mlist;    }        public List
 getMlist() {        return mlist;    }    public void setMlist(List
 mlist) {        this.mlist = mlist;    }    @Override    public int getCount() {        return mlist.size();    }    @Override    public Object getItem(int arg0) {        return mlist.get(arg0);    }    @Override    public long getItemId(int arg0) {        return arg0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHoler holder =null;        if (convertView ==null) {            holder = new ViewHoler();            convertView = ((LayoutInflater) context                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE))                    .inflate(R.layout.item, parent,false);            holder.name= (TextView) convertView.findViewById(R.id.name);            holder.phone = (TextView) convertView.findViewById(R.id.phone);            convertView.setTag(holder);        }else{            convertView.setTag(holder);        }        final Bean bean = mlist.get(position);        holder.name.setText(bean.getUsername());        holder.phone.setText(bean.getPhone());        return convertView;    }    class ViewHoler{        TextView name;        TextView phone;    }    }

万能Adapter代码如下:

package com.imooc.imooc_adapter; import java.util.List; import android.content.Context; import com.imooc.util.CommonAdapter;import com.imooc.util.ViewHolder; public class NewAdapter  extends CommonAdapter
{    public NewAdapter(Context context, List
 mdatas,int layoutId) {        super(context, mdatas,layoutId);    }    @Override    public void convert(ViewHolder holder, Bean bean) {        holder.setText(R.id.phone, bean.getPhone()).setText(R.id.name, bean.getUsername());    } }

由此可见 万能Adapter 可精简的代码量有多少了。

万能适配器 把用户自定义的 ViewHolder 和BaseAdapter 的声明等进行了封装,调用时,需要 CommonAdapter 和ViewHoler 这两个类。

万能适配器 编写逻辑:

 1. 封装ViewHolder,将View convertView 解放出来,实现一条代码 即可完成 convertView的实例化:

ViewHolder holder = ViewHolder.get(mcontext, convertView, parent, postion, layoutId);

 实现方式:

public class ViewHolder {    private SparseArray
 mViews;    private Context mcontext;    private View mConvertView;    private int mposition;     public View getmConvertView() {        return mConvertView;    }         public int getMposition() {        return mposition;    }     public ViewHolder(Context context, ViewGroup parent, int layoutId,            int position) {        this.mposition = position;        this.mViews = new SparseArray
();        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,                false);        mConvertView.setTag(this);    }     public static ViewHolder get(Context context, View convertView,            ViewGroup parent, int position, int layoutId) {        if (convertView == null) {            return new ViewHolder(context, parent, layoutId, position);        } else {            ViewHolder holder = (ViewHolder) convertView.getTag();            holder.mposition = position;            return holder;        }    }         public 
 T getView(int viewid) {        View view = mViews.get(viewid);        if (view == null) {            view = mConvertView.findViewById(viewid);            mViews.put(viewid, view);        }        return (T) view;    }

此处使用 spareArray  类似于:List<int,Object> 形式的存放,想比较HashMap<int,Object> 来说更加节省时间,提高效率。

创建抽象类 CommonAdapter:

public abstract class CommonAdapter
 extends BaseAdapter {    protected Context mcontext;    protected List
 mDatas;    protected LayoutInflater mInlater;    private int layoutId;    public CommonAdapter(Context context ,List
 datas,int layoutId) {        this.mcontext = context;        this.mDatas= datas;        this.layoutId = layoutId;        mInlater = LayoutInflater.from(context);    }              public Context getMcontext() {        return mcontext;    }      public void setMcontext(Context mcontext) {        this.mcontext = mcontext;    }      public List
 getmDatas() {        return mDatas;    }      public void setmDatas(List
 mDatas) {        this.mDatas = mDatas;    }      @Override    public int getCount() {        return mDatas.size();    }     @Override    public T getItem(int arg0) {        return mDatas.get(arg0);    }     @Override    public long getItemId(int arg0) {        return arg0;    }     @Override    public  View getView(int postion, View convertView, ViewGroup parent){        ViewHolder holder = ViewHolder.get(mcontext, convertView, parent, postion, layoutId);        convert(holder, getItem(postion));        return holder.getmConvertView();    };    public abstract void convert(ViewHolder holder,T t);}

将 convert 方法 对外开放给开发者,进行简单的赋值操作。

在 自定义的Adapter 中继承 CommonAdapter:

public class NewAdapter  extends CommonAdapter
{    public NewAdapter(Context context, List
 mdatas,int layoutId) {        super(context, mdatas,layoutId);    }    @Override    public void convert(ViewHolder holder, Bean bean) {        holder.setText(R.id.phone, bean.getPhone()).setText(R.id.name, bean.getUsername());    }}

 在MainActivity中初始化自定义Adapter时,可使用:

adapter= new NewAdapter(getApplicationContext(), mList,R.layout.item);

其中,可以在 ViewHolder 封装类中封装 Adapter中对 控件的操作(视个人需求而定)

public ViewHolder setText(int viewId, String text) {        TextView tv = getView(viewId);        tv.setText(text);        return this;    }public ViewHolder setImageResource(int viewId,int resId){        ImageView img= getView(viewId);        img.setImageResource(resId);        return this;            }

转载于:https://my.oschina.net/leov1/blog/485649

你可能感兴趣的文章
Web service是什么?
查看>>
浅析HTML5的10大优势
查看>>
实例讲解基于 React+Redux 的前端开发流程
查看>>
[转]Vim配置与高级技巧
查看>>
查找SQL数据表或视图中的字段属性信息
查看>>
如何优化UPS的工作模式为数据中心节省运营成本
查看>>
使用python来访问Hadoop HDFS存储实现文件的操作
查看>>
靠能力赚大钱,是最最可笑的谎言
查看>>
WORD设置节起始页码后出现诡异隐藏页/跳页、节首页页面边框丢失
查看>>
团队文化之表扬和批评
查看>>
国家能源局:《电力企业网络与信息安全专项监管报告》
查看>>
Gartner:2012年SIEM(安全信息与事件管理)市场分析报告
查看>>
社交大革命,不可遏止的互联网春天
查看>>
也谈nginx的安全限制
查看>>
mongodb数据库问题三则
查看>>
【翻译】了解ASP.NET MVC的HTML助手
查看>>
老男孩:Linux运维岗位强于开发岗位的6点优势
查看>>
烂泥:mysql5.5多实例部署
查看>>
了解BYOD---工作方式的新时尚
查看>>
fastdfs binlog同步BUG
查看>>