Android資料介面卡Adapter的快速使用(只需要兩步)
什麼是資料介面卡?
下圖展示了資料來源、介面卡、ListView等資料展示控制元件之間的關係。我們知道,資料來源是各種各樣的,而ListView所展示資料的格式則是有一定的要求的。資料介面卡正是建立了資料來源與ListView之間的適配關係,將資料來源轉換為ListView能夠顯示的資料格式,從而將資料的來源與資料的顯示進行解耦,降低程式的耦合性。這也體現了Android的介面卡模式的使用。對於ListView、GridView等資料展示控制元件有多種資料介面卡,本文講解最通用的資料介面卡——BaseAdapter
如何使用?
使用BaseAdapter比較簡單,主要是通過繼承此類來實現BaseAdapter的四個方法:
public int getCount(): 介面卡中資料集的資料個數;
public Object getItem(int position): 獲取資料集中與索引對應的資料項;
public long getItemId(int position): 獲取指定行對應的ID;
public View getView(int position,View convertView,ViewGroup parent): 獲取沒一行Item的顯示內容。
第一步:建立MyAdapter.java的類。
package com.example.text.Adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.text.newhd.R;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public abstract class MyAdapter<T> extends BaseAdapter {
private ArrayList<T> mData;
private int mLayoutRes; //佈局id
public MyAdapter() {
}
public MyAdapter(ArrayList<T> mData, int mLayoutRes) {
this.mData = mData;
this.mLayoutRes = mLayoutRes;
}
@Override
public int getCount() {
return mData != null ? mData.size() : 0;
}
@Override
public T getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes
, position);
bindView(holder, getItem(position));
return holder.getItemView();
}
public abstract void bindView(ViewHolder holder, T obj);
//新增一個元素
public void add(T data) {
if (mData == null) {
mData = new ArrayList<>();
}
mData.add(data);
notifyDataSetChanged();
}
//往特定位置,新增一個元素
public void add(int position, T data) {
if (mData == null) {
mData = new ArrayList<>();
}
mData.add(position, data);
notifyDataSetChanged();
}
public void remove(T data) {
if (mData != null) {
mData.remove(data);
}
notifyDataSetChanged();
}
public void remove(int position) {
if (mData != null) {
mData.remove(position);
}
notifyDataSetChanged();
}
public void clear() {
if (mData != null) {
mData.clear();
}
notifyDataSetChanged();
}
public static class ViewHolder {
private SparseArray<View> mViews; //儲存ListView 的 item中的View
private View item; //存放convertView
private int position; //遊標
private Context context; //Context上下文
//構造方法,完成相關初始化
private ViewHolder(Context context, ViewGroup parent, int layoutRes) {
mViews = new SparseArray<>();
this.context = context;
View convertView = LayoutInflater.from(context).inflate(layoutRes, parent, false);
convertView.setTag(this);
item = convertView;
}
//繫結ViewHolder與item
public static ViewHolder bind(Context context, View convertView, ViewGroup parent,
int layoutRes, int position) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder(context, parent, layoutRes);
} else {
holder = (ViewHolder) convertView.getTag();
holder.item = convertView;
}
holder.position = position;
return holder;
}
@SuppressWarnings("unchecked")
public <T extends View> T getView(int id) {
T t = (T) mViews.get(id);
if (t == null) {
t = (T) item.findViewById(id);
mViews.put(id, t);
}
return t;
}
/**
* 獲取當前條目
*/
public View getItemView() {
return item;
}
/**
* 獲取條目位置
*/
public int getItemPosition() {
return position;
}
/**
* 設定文字
*/
public ViewHolder setText(int id, CharSequence text) {
View view = getView(id);
if (view instanceof TextView) {
((TextView) view).setText(text);
}
return this;
}
/**
* 設定圖片
*/
public ViewHolder setImageResource(int id, int drawableRes) {
View view = getView(id);
if (view instanceof ImageView) {
((ImageView) view).setImageResource(drawableRes);
} else {
view.setBackgroundResource(drawableRes);
}
return this;
}
/**
* 設定網路圖片
*/
public ViewHolder setNetImageResource(int id, String imagePath) {
View view = getView(id);
if (view instanceof ImageView) {
Picasso.with(context).load(imagePath)
.error(R.drawable.inagerro).into((ImageView) view);
} else {
Picasso.with(context).load(imagePath)
.error(R.drawable.inagerro).into((ImageView) view);
}
return this;
}
/**
* 設定點選監聽
*/
public ViewHolder setOnClickListener(int id, View.OnClickListener listener) {
getView(id).setOnClickListener(listener);
return this;
}
/**
* 設定可見
*/
public ViewHolder setVisibility(int id, int visible) {
getView(id).setVisibility(visible);
return this;
}
/**
* 設定標籤
*/
public ViewHolder setTag(int id, Object obj) {
getView(id).setTag(obj);
return this;
}
}
}
設定網路圖片方法中使用Android圖片下載快取庫 Picasso
//R.drawable.inagerro載入失敗顯示的圖片
Picasso.with(context).load(imagePath)
.error(R.drawable.inagerro).into((ImageView) view);
第二步:在MainActivity中具體使用
MyAdapter<OpenCursorBean_Campaign> myAdapter = new MyAdapter<OpenCursorBean_Campaign>((ArrayList<OpenCursorBean_Campaign>) list, R.layout.adapter_campaign) {
@Override
public void bindView(ViewHolder holder, OpenCursorBean_Campaign obj) {
holder.setText(R.id.index, (holder.getItemPosition() + 1) + ".");
holder.setText(R.id.hospitalName, obj.getAPPR_TITLE());
holder.setText(R.id.code, "編號:" + obj.getREPORT_CODE() + " 圖片:" + obj.getPHOTO_COUNT());
holder.setText(R.id.status, obj.getSTATUS());
}
};
最後在onCreate方法中 listview.setAdapter(myAdapter );即可
相信做Android開發的寫得最多的就是ListView,GridView的介面卡吧,記得以前開發一同事開發專案,一個專案下來基本就一直在寫ListView的Adapter都快吐了~~~有了上面的方法就方便多了。