- Android 万能适配器 节省你的开发时间
- 发布时间:2016/1/8 来源:搜数网络 浏览:35
项目中ListView GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter。用起来虽然还不错,但每次都需要去继承一个BaseAdapter,然后实现里面的一大堆方法,而我们每次最关心的无非就是getView方法,其余的方法几乎都是相同代码。这里是不是就可以优化起来呢?在其次,我们在使用Adapter的时候,为了优化性能,常常会创建一个Holder。而Holder里面每次存放的都是View,对Holer的操作无非也就是初始化,绑定数据,复用。这里是不是也可以抽取抽取? 好了,废话不多说,直接上代码。
首先第一步操作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);
- }
第二步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;
- }
- }
第三步使用
- 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,能节约不少开发时间
原文地址:http://blog.csdn.net/soul_code/article/details/50156201