今天要寫的文章沒有什麼技術難點,主要是自己對編程心得的一些小總結。
我們都知道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 寫到這吧~