1. 程式人生 > >Android資料介面卡Adapter的快速使用(只需要兩步)

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都快吐了~~~有了上面的方法就方便多了。