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、完整 点击打开链接代码