项目中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;}@Overridepublic int getCount() {return listDatas == null ? 0 : listDatas.size();}@Override/** * 获取当前点击的Item的数据时用 * 在onItemClick中 parent.getAdapter().getItem(),获取当前点击的Item的数据 */public Object getItem(int position) {return listDatas.get(position);}@Overridepublic 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);}@Overrideprotected 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,能节约不少开发时间



更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android用户界面设计:布局基础
  5. Android自动接听和挂断电话实现原理
  6. 基于 Android(安卓)NDK 的学习之旅----- C调用Java
  7. Android设备的内置存储和外置存储到底是怎么回事,深入理解
  8. android中SparseArray和ArrayMap代替HashMap
  9. android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原

随机推荐

  1. android looper介绍
  2. Android(安卓)adb不是内部或外部命令 问
  3. Dex2jar 与 JD-GUI快速反编译Android(安
  4. Android通过软解码播放视频
  5. 分析Android(安卓)根文件系统启动过程(ini
  6. Android: Service中创建窗口Dialog
  7. Android(安卓)adb的使用略解
  8. Android(安卓)arm linux kernel启动流程(
  9. 关于Android的Holo主题
  10. 初学Android,增加手势到手势库(五十)