利用泛型给ListView,GridView打造适配器模板

来源:互联网 发布:我的兄弟姐妹 网络歌曲 编辑:程序博客网 时间:2024/06/07 06:50

今天要写的文章没有什么技术难点,主要是自己对编程心得的一些小总结。

我们都知道android是基于java语言的,java自问世以来到现在一直占领着编程语言的榜首,这说明了java的确是一门优秀的编程语言。java之所以被广大的编程者所认可,不仅仅是因为简单易学,更因为java是面向对象的,为我们在思考问题的时候提供了新的思路。简单的举个例子,我们要建一栋楼房,假如从面向过程的思想来思考,我们就需要考虑建造一栋大楼需要哪些步骤,然后我们一步一步的去完成。但是从面向对象来考虑,就简单多了,我们只需要分析造一栋大楼需要哪些对象来完成,比如建筑工人,工程师等等,但是他们具体怎么去干,我们不用关心。我感觉编程不仅仅是一种技术,更是一种艺术,所以我们在实现功能需要花点心思,如何在实现功能的基础上,让自己的编码更加优雅。~好吧 又跑题了-_-|了,下面回归正题:

在我们的日常开发中,ListView和GridView是我们经常用到的控件,而编写相对应的适配器也是我们必不可少的一步。其中我们用的最多的可能就是BaseAdapter了,而我们在编写子类去继承BaseAdapter的时候,因为BaseAdapter是抽象类,子类在继承它的时候需要实现它的四个抽象方法:getCount()、getItem()、getItemId()、getView() 其实在这四个方法里面我们只关心的是getView里面的实现,而另外三个方法里面的实现基本都是如出一辙,所以我们考虑是不是可以封装一个模板类,让它实现这三个方法,只留下getView()方法让子类去实现。可是我们都知道,适配器是需要和数据源打交道的,数据源对应的实体类肯定不止一种,那我们怎么去抽取这个模板呢?不要愁,这个问题我们用泛型就能轻易解决。下面我贴一下代码,后面再做进一步分析:

package com.common.base;import android.content.Context;import android.view.LayoutInflater;import android.widget.BaseAdapter;import java.util.ArrayList;import java.util.List;/** * Created by Admin on 2016/6/30. * 泛型代表的就是实体类的类型 */public abstract class BasicAdapter<T> extends BaseAdapter {    private List<T> mList;    private Context mContext;    private LayoutInflater mInflater;    public BasicAdapter(Context context) {        this(context, new ArrayList<T>());    }    public BasicAdapter(Context context, List<T> data) {        this.mContext = context;        this.mList = data;        this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    }    @Override    public int getCount() {        return mList == null ? 0 : mList.size();    }    @Override    public T getItem(int position) {        return (mList == null || position < 0 || position >= mList.size()) ? null : mList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    /**     * 获取数据集合     * @return     */    public List<T> getData(){        return mList;    }    /**     * 获取当前上下文     * @return     */    public  Context getContext(){        return mContext;    }    /**     * 获取LayoutInflater实例     * @return     */    public LayoutInflater getInflater(){        return mInflater;    }    /**     * 更新一条数据     * @param position     * @param data     */    public void update(int position,T data){        if (mList == null) {            mList = new ArrayList<T>();        }        mList.set(position,data);        notifyDataSetChanged();    }    /**     * 更新全部数据     * @param data     */    public void updateAll(List<T> data){        if (data == null)            return;        mList = data;        notifyDataSetChanged();    }    /**     * 以追加的方式增加数据     * @param data     */    public void updateAppend(List<T> data){        if(data==null){            return;        }        if(mList==null){            mList=data;        }else {            mList.addAll(data);        }        notifyDataSetChanged();    }    /**     * 根据位置删除数据中的数据项     * @param position     */    public void remove(int position){        if (mList != null && position >= 0 && position < mList.size()) {            mList.remove(position);            notifyDataSetChanged();        }    }    /**     * 删除全部数据     */    public void removeAll() {        if (mList != null) {            mList.clear();            notifyDataSetChanged();        }    }}

可以看到这个类还是抽象的,但是它的子类在继承它的时候只需要去实现getView()方法就可以了,而另外三个方法,我们就不用关心了。当然在上面我还声明了几个常用的方法,大家可以根据注释简单看一下,都很简单~。

其实今天强调的主要是这种思想,在日常的编程中,我们要尽量少的去写一些重复代码,代码的复用性我们一般是通过编写工具类和继承来提高。就像在使用Activity的时候我们一般都会继承根据自己需求编写的BaseActivity一样,而BaseActivity里面通常做一些基础的处理,里面通常包含抽取出来常用的一些方法。如果我们在编程的过程中,只是一味的实现功能,而不去考虑代码的复用性,那这样的代码堆砌起来的工程,让别人去维护简直就是灾难。个人认为,java玩的就是思想,适当的用一些设计模式,才能让你的代码更优雅。如果只注重实现功能的过程,那也失去了java的灵魂。    ok  写到这吧~


0 0
原创粉丝点击