BaseAdapter用于ListView、Spinner,作為資料擴充卡,很多地方會使用到它。當我們實作它時,需要實作以下幾個方法:
public int getViewTypeCount();//每種資料來源種類的總個數
public int getCount();//總個數
public int getItemViewType(int position);//目前標明的這項所對應的資料來源種類
public Object getItem(int position);//目前標明的資料
public long getItemId(int position);//目前標明的資料對應ID
public View getView(int position, View convertView, ViewGroup parent);//展現資料的視圖
現在我們用一個例子來展現。目前,手機助手很流行,下面的效果我們應該見得挺多,如下圖:

1、AdapterActivity
package com.example.test.activity;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Window;
import android.widget.ListView;
import com.example.test.R;
import com.example.test.adapter.ItemDataDef;
import com.example.test.adapter.LocalAppAdapter;
import com.example.test.data.DataCenter;
import com.example.test.utils.device.LocalApps;
import com.example.test.utils.image.ImageLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* @authore WinterFellSo 2017/3/15
* @purpose Adapter
*/
public class AdapterActivity extends Activity implements LocalAppAdapter.Callback, Observer {
private static String TAG = "AdapterActivity";
private ListView mListView;
private LocalAppAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.fragment_manage_local);
initGui();
initAction();
initData();
}
public void initGui() {
mListView = (ListView) findViewById(R.id.list_view);
}
public void initAction() {
}
public void initData() {
mAdapter = new LocalAppAdapter(this);
mAdapter.registerCallback(this);
mListView.setAdapter(mAdapter);
mListView.setCacheColorHint(Color.TRANSPARENT);
DataCenter dataCenter=DataCenter.getInstance();
dataCenter.ensureInit(this);
ImageLoader.getInstance().initLoader(this);
List<LocalApps.LocalAppInfo> localData = dataCenter.requestLocalData();//擷取本地非系統app應用
buildLocalData(localData);//資料裝載,元件重繪
}
protected void refreshAppData() {
List<LocalApps.LocalAppInfo> localData = DataCenter.getInstance().requestLocalData();
buildLocalData(localData);
}
private void buildLocalData(List<LocalApps.LocalAppInfo> data) {
if (data == null || data.size() <= 0)
return;
ArrayList<ItemDataDef.ItemDataWrapper> items = new ArrayList<ItemDataDef.ItemDataWrapper>();
for (LocalApps.LocalAppInfo info : data) {
items.add(new ItemDataDef.ItemDataWrapper(info, LocalAppAdapter.TYPE_LOCAL_APP));
}
mAdapter.setData(items);
mAdapter.notifyDataSetChanged();
}
@Override
public void onUninstallClick(LocalApps.LocalAppInfo info) {//解除安裝
if (info != null && !TextUtils.isEmpty(info.mPackageName)); {
LocalApps.reqSystemUninstall(this, info.mPackageName);
}
}
@Override
public void update(Observable observable, Object data) {
List<LocalApps.LocalAppInfo> localData = DataCenter.getInstance().requestLocalData();
buildLocalData(localData);
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
DataCenter.getInstance().deleteObserver(this);
super.onDestroy();
}
@Override
public void onResume() {
super.onResume();
refreshAppData();
}
}
2、LocalAppAdapter
package com.example.test.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.example.test.utils.device.LocalApps;
import java.util.ArrayList;
/**
* 本地應用管理清單Adapter
*
*
*/
public class LocalAppAdapter extends BaseAdapter {
public static final int TYPE_LOCAL_APP = 1;
/** 清單控件類型數 */
public static final int VIEW_TYPE_COUNT = 2;
private LayoutInflater mInflater;
private ArrayList<ItemDataDef.ItemDataWrapper> mData;
private Callback mCallback;
public static interface Callback {
public void onUninstallClick(LocalApps.LocalAppInfo info);
}
public LocalAppAdapter(Context context) {
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void setData(ArrayList<ItemDataDef.ItemDataWrapper> data) {
mData = data;
}
public void registerCallback(Callback callback) {
mCallback = callback;
}
@Override
public int getViewTypeCount() {
return VIEW_TYPE_COUNT;
}
@Override
public int getCount() {
return mData == null ? 0 : mData.size();
}
@Override
public int getItemViewType(int position) {
return mData.get(position).mItemType;
}
@Override
public Object getItem(int position) {
return mData.get(position).mData;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int viewType = getItemViewType(position);
switch (viewType) {
case TYPE_LOCAL_APP:
LocalApps.LocalAppInfo item = (LocalApps.LocalAppInfo) getItem(position);
convertView = ItemBuilder.buildLocalAppView(mInflater, position, item, convertView, parent);
ItemBuilder.LocalAppViewHolder holder = (ItemBuilder.LocalAppViewHolder) convertView.getTag();
holder.mUninstallButton.setOnClickListener(mOnUninstallClicked);
return convertView;
default:
throw new RuntimeException();
}
}
private OnClickListener mOnUninstallClicked = new OnClickListener() {
@Override
public void onClick(View v) {
if (mCallback != null) {
mCallback.onUninstallClick((LocalApps.LocalAppInfo) v.getTag());
}
}
};
}
3、fragment_manage_local.xml布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/main_layout_bg" >
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/list_view_margin_top"
android:layout_marginBottom="@dimen/list_view_margin_bottom"
android:background="@android:color/transparent"
android:listSelector="@android:color/transparent"
android:divider="@null"
android:footerDividersEnabled="false" />
</RelativeLayout>
4、完整 點選打開連結代碼