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

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

我们都知道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  写到这吧~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章