今天要写的文章没有什么技术难点,主要是自己对编程心得的一些小总结。
我们都知道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 写到这吧~