原标题:Android万能适配器简化繁琐的开发
项目中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,能节约不少开发时间。
相关:
看Instagram和Snapchat如何打造让用户上瘾的广告
研究结论1. Instagram的广告拥有图片、预告片、幻灯片3种形式,其中预告片是最受重视的广告形式。2. Snapchat的
在开发中使用一些工具类,能让代码更加简洁,开发效率也更高,下面是我收集的Android中常用的一些开发工具类
本文由玩赚乐(www.banghui.org)– 风满楼原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划
iOS仿微信图片选择器,适配iOS6-9系统,3行代码即可集成
前段时间空余时间比较多,打算尝试做一个图片选择器出来,仔细对比了很多自定义了图片选择器的应用,感觉最
Android开发者在语言限制方面面临着一个困境。众所周知,目前的Android开发只支持Java 6(语言本身从Java 7
? 1995 - 2016 China Times Inc. 请尊重智慧财产权勿任意转载违者依法必究。
马刺法籍前锋迪奥一边练球,一旁摆着自画像。(取自坎南推特) 看来马刺法籍前锋迪奥最近真的很想捧红自己!
近日罗志祥发文斥小S与Makiyo「孝顺说」。(图/取材自脸书) 小猪罗志祥今(10日)于西门町举办签唱会,谈起
《我是歌手》中歌手唱到动情处,往往会出现表情夸张的「夸张帝」。(图/翻摄自Youtube) 大陆湖南卫视《我是
许多艺人的爱犬曝光度极高,时常变成粉丝关注的焦点。(图/翻摄自Instagram、网路、脸书) 狗是人类最好的朋