首页 > 娱乐前沿 > 热点
Android万能适配器简化繁琐的开发
佚名 2016-01-10 16:25:08

项目中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,能节约不少开发时间。

上一篇  下一篇

I 相关 / Other

看Instagram和Snapchat如何打造让用户上瘾的广告

研究结论1. Instagram的广告拥有图片、预告片、幻灯片3种形式,其中预告片是最受重视的广告形式。2. Snapchat的

Android常用开发工具类源代码

在开发中使用一些工具类,能让代码更加简洁,开发效率也更高,下面是我收集的Android中常用的一些开发工具类

7个jQuery最佳实践

本文由玩赚乐(www.banghui.org)– 风满楼原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划

iOS仿微信图片选择器,适配iOS6-9系统,3行代码即可集成

前段时间空余时间比较多,打算尝试做一个图片选择器出来,仔细对比了很多自定义了图片选择器的应用,感觉最

每个Android程序员应该知道的Kotlin

Android开发者在语言限制方面面临着一个困境。众所周知,目前的Android开发只支持Java 6(语言本身从Java 7

I 热点 / Hot