相信有Android開發經驗的同仁,開發項目時寫ListView、GridView的擴充卡最多,并且做得都是重複的工作,這就要求我們對擴充卡進行封裝。
下面我就直接貼上代碼了,布局檔案都一個樣,我就不貼了。
/**
* 通用擴充卡(Universal BaseAdapter)
*
* 1、第二個構造方法:ArrayAdapter源碼構造方法寫法
* 2、同時擴充卡增加了添加資料、移除資料等方法
*
* @author linvisf
*
* @param <T>
*/
public abstract class UBaseAdapter<T> extends BaseAdapter {
private Context context;
private List<T> list;
//提供兩種常用資料源的構造方法
public UBaseAdapter(Context context, List<T> list){
this.context = context;
this.list = list;
}
public UBaseAdapter(Context context, T[] dataArray){
this.context = context;
this.list = Arrays.asList(dataArray);
}
@Override
public int getCount() {
if (list != null)
return list.size();
return ;
}
@Override
public T getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/**傳回item布局的resource id*/
public abstract int getItemLayoutResId();
public abstract View bindView(View convertView, int position, ViewHolder holder);
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (null == convertView) {
convertView = View.inflate(context, getItemLayoutResId(), null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return bindView(convertView, position, holder);
}
/**
* ViewHolder
* @author linvisf
*/
public class ViewHolder {
private SparseArray<View> views = new SparseArray<View>();
private View convertView;
public ViewHolder(View convertView) {
this.convertView = convertView;
}
@SuppressWarnings({ "unchecked", "hiding" })
public <T extends View> T getView(int resId) {
View v = views.get(resId);
if (null == v) {
v = convertView.findViewById(resId);
views.put(resId, v);
}
return (T) v;
}
}
public List<T> getList(){
return list;
}
public void add(T t){
list.add(t);
notifyDataSetChanged();
}
public void addAll(List<T> t){
list.addAll(t);
notifyDataSetChanged();
}
public void set(T oldT, T newT){
set(list.indexOf(oldT), newT);
}
public void set(int index, T t){
list.set(index, t);
notifyDataSetChanged();
}
public void remove(T t){
list.remove(t);
notifyDataSetChanged();
}
public void remove(int index){
list.remove(index);
notifyDataSetChanged();
}
public boolean contains(T t){
return list.contains(t);
}
}
以上代碼就是通用擴充卡工具,下面是如何調用我們通用擴充卡:
a、寫在目标activity部分代碼
//使用ArrayList<T> 和數組資料源一樣,隻是構造方法不同而已
String[] mDatas = new String[]{"android", "ios","java","web","sqlite","javascript"};
SimpleListAdapter adapter = new SimpleListAdapter(this, mDatas);
ListView mListView = (ListView) findViewById(R.id.listview1);
mListView.setAdapter(adapter);
b、寫個擴充卡SimpleListAdapter 繼承UBaseAdapter,如下:
public class SimpleListAdapter extends UBaseAdapter<String> {
//如果是List資料源,則使用SimpleListAdapter(Context context, List<String> list)
public SimpleListAdapter(Context context, String[] dataArray) {
super(context, dataArray);
}
@Override
public int getItemLayoutResId() {
return R.layout.item_pop;
}
@Override
public View bindView(View convertView, int position, ViewHolder holder) {
//擴充卡布局中有多少個控件,都調用ViewHolder.getView(id)即可
TextView tv_label = holder.getView(R.id.tv_label);
tv_label.setText(getItem(position));
return convertView;
}
}
到此Android通用擴充卡寫完,如那裡寫得不好,請大家多多見諒、指正。