Androidユニバーサルアダプタは開発時間を節約
プロジェクトではListView GridViewはほとんど必須のコンポーネントであり、Androidもこれらのコントロールにデータをバインドするメカニズムを提供しています.それはAdapterです.使うのは悪くないが、毎回BaseAdapterを継承し、中の多くの方法を実現する必要があるが、私たちが最も関心を持っているのはgetView方法にほかならない.残りの方法はほとんど同じコードだ.ここで最適化できるのではないでしょうか.次に、Adapterを使用する場合、パフォーマンスを最適化するためにHolderを作成することがよくあります.Holderには毎回Viewが格納されており、Holerに対する操作は初期化、バインドデータ、多重化にほかならない.ここでも抽出できますか?はい、くだらないことはあまり言わないで、直接コードをつけます.
まず最初のステップでは、BaseAdapterの共通部分抽出を行います.
第2ステップHolerの汎用化
手順3
ここまで万事順調で、これからAdaperを書くたびに、Itemのレイアウトにかかわらず、データをバインドする方法を書き直すだけでOKで、開発時間を節約できます.
まず最初のステップでは、BaseAdapterの共通部分抽出を行います.
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
/**
*
*
* @author Mr.Himan
*
* @param <T>
*
*/
public abstract class CommonAdapter<T> extends BaseAdapter {
/**
*
*/
protected Context mContext;
/**
*
*/
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
/**
* Item
* onItemClick parent.getAdapter().getItem(), Item
*/
public Object getItem(int position) {
return listDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
/**
*
*/
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = ViewHolder.getViewHolder(mContext, convertView,
parent, layoutId, position);
fillData(holder, position);
return holder.getMConvertView();
}
/**
*
* , ,
* @param holder
* @param position
*/
protected abstract void fillData(ViewHolder holder, int position);
}
第2ステップ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 , 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;
}
}
手順3
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()) + " ");
time.setText(String.valueOf(item.getTimeSum()) + "h");
title.setText(item.getName());
BitmapHelper.getInstance(context).display(icon, item.getPhoto());
}
}
ここまで万事順調で、これからAdaperを書くたびに、Itemのレイアウトにかかわらず、データをバインドする方法を書き直すだけでOKで、開発時間を節約できます.