利用泛型給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  寫到這吧~


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