- Android 萬(wàn)能適配器 節(jié)省你的開(kāi)發(fā)時(shí)間
- 發(fā)布時(shí)間:2016/1/8 來(lái)源:搜數(shù)網(wǎng)絡(luò) 瀏覽:35
項(xiàng)目中ListView GridView幾乎是必用的組件,Android也提供一套機(jī)制,為這些控件綁定數(shù)據(jù),那就是Adapter。用起來(lái)雖然還不錯(cuò),但每次都需要去繼承一個(gè)BaseAdapter,然后實(shí)現(xiàn)里面的一大堆方法,而我們每次最關(guān)心的無(wú)非就是getView方法,其余的方法幾乎都是相同代碼。這里是不是就可以優(yōu)化起來(lái)呢?在其次,我們?cè)谑褂肁dapter的時(shí)候,為了優(yōu)化性能,常常會(huì)創(chuàng)建一個(gè)Holder。而Holder里面每次存放的都是View,對(duì)Holer的操作無(wú)非也就是初始化,綁定數(shù)據(jù),復(fù)用。這里是不是也可以抽取抽??? 好了,廢話不多說(shuō),直接上代碼。
首先第一步操作BaseAdapter公共部分抽取:
- import java.util.List;
- import android.content.Context;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- /**
- * 萬(wàn)能適配器
- *
- * @author Mr.Himan
- *
- * @param <T>
- * 數(shù)據(jù)源的數(shù)據(jù)類型
- */
- public abstract class CommonAdapter<T> extends BaseAdapter {
- /**
- * 上下文
- */
- protected Context mContext;
- /**
- * 數(shù)據(jù)源
- */
- protected List<T> listDatas;
- /**
- * Item布局ID
- */
- protected int layoutId;
- public CommonAdapter(Context context, List<T> listDatas, int layoutId) {
- this.mContext = context;
- this.listDatas = listDatas;
- this.layoutId = layoutId;
- }
- @Override
- public int getCount() {
- return listDatas == null ? 0 : listDatas.size();
- }
- @Override
- /**
- * 獲取當(dāng)前點(diǎn)擊的Item的數(shù)據(jù)時(shí)用
- * 在onItemClick中 parent.getAdapter().getItem(),獲取當(dāng)前點(diǎn)擊的Item的數(shù)據(jù)
- */
- public Object getItem(int position) {
- return listDatas.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- /**
- * 只關(guān)心這一個(gè)方法
- */
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = ViewHolder.getViewHolder(mContext, convertView,
- parent, layoutId, position);
- fillData(holder, position);
- return holder.getMConvertView();
- }
- /**
- *
- * 抽象方法,用于子類實(shí)現(xiàn),填充數(shù)據(jù)
- * @param holder
- * @param position
- */
- protected abstract void fillData(ViewHolder holder, int position);
- }
第二步Holer的通用化
- import android.content.Context;
- import android.util.SparseArray;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- /**
- *
- * @author Mr.Himan Holer的通用化處理
- *
- */
- public class ViewHolder {
- /**
- * View容器,用于存放Holer中的View
- * 照顧下小白 SparseArray 是Android推薦使用的一個(gè)優(yōu)化容器,相當(dāng)于一個(gè)Map<integer,View>
- */
- private SparseArray<View> mViews;
- /**
- * Item布局View convertView
- */
- private View mConvertView;
- public ViewHolder(Context context, ViewGroup parent, int layoutId) {
- mViews = new SparseArray<View>();
- mConvertView = LayoutInflater.from(context).inflate(layoutId, null);
- mConvertView.setTag(this);
- }
- /**
- * 獲取ViewHolder
- *
- * @param context
- * 上下文
- * @param convertView
- * @param parent
- * @param layoutId
- * 布局layout Id
- * @param position
- * @return
- */
- public static ViewHolder getViewHolder(Context context, View convertView,
- ViewGroup parent, int layoutId) {
- if (convertView == null)
- return new ViewHolder(context, parent, layoutId);
- return (ViewHolder) convertView.getTag();
- }
- /**
- * 獲取Holder中的ItemView
- *
- * @param viewId
- * @return
- */
- @SuppressWarnings("unchecked")
- public <T extends View> T getView(int viewId) {
- View item = mViews.get(viewId);
- if (item == null) {
- item = mConvertView.findViewById(viewId);
- mViews.put(viewId, item);
- }
- return (T) item;
- }
- /**
- * 獲取convertView
- *
- * @return
- */
- public View getMConvertView() {
- return mConvertView;
- }
- }
第三步使用
- package com.css.volunteer.adapter;
- import java.util.List;
- import android.content.Context;
- import android.widget.TextView;
- import com.css.volunteer.bean.VolTeamItem;
- import com.css.volunteer.bitmap.BitmapHelper;
- import com.css.volunteer.manager.R;
- import com.css.volunteer.view.CustomImageView;
- public class VolTeamAdapter extends CommonAdapter<Bean> {
- public VolTeamAdapter(Context context, List<Bean> listDatas,
- int layoutId) {
- super(context, listDatas, layoutId);
- }
- @Override
- protected void fillData(ViewHolder holder, int position) {
- TextView actNum = holder.getView(R.id.team_item_active_num);
- TextView time = holder.getView(R.id.team_item_time);
- TextView title = holder.getView(R.id.team_item_title);
- CustomImageView icon = holder.getView(R.id.team_item_icon);
- Beanitem = listDatas.get(position);
- actNum.setText(String.valueOf(item.getActiveSum()) + "個(gè)");
- time.setText(String.valueOf(item.getTimeSum()) + "h");
- title.setText(item.getName());
- BitmapHelper.getInstance(context).display(icon, item.getPhoto());
- }
- }
到這里 萬(wàn)事大吉,以后每次寫Adaper的時(shí)候,無(wú)論你的Item布局怎么樣,只需要重寫一個(gè)方法綁定你的數(shù)據(jù)就OK,能節(jié)約不少開(kāi)發(fā)時(shí)間