天天看點

BaseAdapter使用總結

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);//展現資料的視圖
           

現在我們用一個例子來展現。目前,手機助手很流行,下面的效果我們應該見得挺多,如下圖:

BaseAdapter使用總結

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、完整 點選打開連結代碼