基于BaseAdapter的安卓百变Adapter实现
来源:互联网 发布:多传感器数据融合改进 编辑:程序博客网 时间:2024/05/29 19:20
因为懒惰,所以造就各种便捷的工具类。 --来自懒惰的猿
Android写了很多的listview也写了很多adapter,每个适配器都要实现它的方法,每个适配器里面还要加一个内部类viewHolder去承载它的view然后实现复用,简直就是浪费时间,身为一个懒惰的程序员完全不能忍,所以CommonAdapter应用而生。(talk is cheap,先上代码在废话)
/** * @Author: kisty_hui(jamesKing0812@Gmail.com). * @Detail: CommonAdapter * @Motto: Never Give Up !!! */public abstract class CommonAdapter<T> extends BaseAdapter { private List<T> mDataList; private Activity context; private int layoutId; public OnItemClickListener itemClickListener; public CommonAdapter(Activity context, List<T> mDataList, int layoutId) { this.mDataList = mDataList; this.context = context; this.layoutId = layoutId; } @Override public int getCount() { return null == mDataList ? 0 : mDataList.size(); } @Override public T getItem(int position) { return mDataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final CommonViewHolder commonViewHolder = CommonViewHolder.get(context, convertView, parent, layoutId); View view = commonViewHolder.getConvertView(); resetView(position, commonViewHolder, getItem(position)); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemClick(getItem(position), R.id.parentId, position); } } }); return view; } public abstract void resetView(int position, CommonViewHolder viewHolder, T item); public void updateData(List<T> data) { this.mDataList = data; notifyDataSetChanged(); } public void setOnitemClickListenr(OnItemClickListener<T> onitemClickListenr) { this.itemClickListener = onitemClickListenr; } public List<T> getListData() { return mDataList; } public Activity getContext() { return context; }}
抽象化一个CommonAdapter类,利用泛型传入数据源,实现BaseAdapter的四个抽象方法,这样继承CommonAdapter时候就不用在实现这些方法,如果有定制化需求也可以重写这些方法,CommonAdapter这里新添加的抽象方法resetView(),是以便继承类可以进行view跟数据的绑定操作。
public interface OnItemClickListener <T> { /** * 点击事件分发 * @param item * @param viewId * @param position */ void onItemClick(T item,int viewId,int position);}
我们的CommonAdapter还实现了item的点击回调事件,可以针对item的不同viewid进行回调事件分发,这里的parentId是事先定义好的一个整体item的id,这样就直接可以在Activity里面直接进行回调处理。 这里还有一个莫名其妙的CommonViewHolder,其实就是一个万能ViewHolder。
public class CommonViewHolder { private SparseArray<View> mViews; private View mConvertView; public CommonViewHolder(Context context, ViewGroup parent, int layoutId) { this.mViews = new SparseArray<>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public static CommonViewHolder get(Context context, View mConvertView, ViewGroup viewGroup, int layoutId) { if (mConvertView == null) { return new CommonViewHolder(context, viewGroup, layoutId); } return (CommonViewHolder) mConvertView.getTag(); } public View getConvertView() { return mConvertView; } public <T extends View> T getView(int viewId, Class<T> tClass) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; }}
首先说一下SparseArray,SparseArray是Android里为<Interger,Object>这样的Hashmap而专门写的类,目的是提高内存效率,其核心是折半查找函数(binarySearch),这里把每个view都存放在SparseArray里,不用每次都去findview,mConvertView也进行了复用处理,这些操作都是为了提高内存效率以及让listview滚动的更流畅。
示例如下:
public class Adapter extends CommonAdapter<String> {//传入任意数据源类型 public Adapter(Activity context, List<String> mDataList, int layoutId) { super(context, mDataList, layoutId); } @Override public void resetView(int position, CommonViewHolder viewHolder, String item) { //这里写入你的item的view逻辑处理和数据绑定 //提供两种getview方法 viewHolder.getView(R.id.textView, TextView.class).setText(""); TextView textView=viewHolder.getView(R.id.textView); }}
0 0
- 基于BaseAdapter的安卓百变Adapter实现
- 基于BaseAdapter的安卓百变Adapter实现
- 扩展BaseAdapter实现Adapter
- 继承BaseAdapter实现自定义Adapter
- 继承BaseAdapter实现Filterable的adapter类完整示例
- 继承BaseAdapter实现Filterable的adapter类完整示例
- Android的Adapter与BaseAdapter的介绍
- Android ListView的了解Adapter, BaseAdapter, RecycleBin
- 基于SimpleAdapter与BaseAdapter的不同ListView实现
- Android Adapter接口及实现类之ArrayAdapter、SimpleAdapter和BaseAdapter的简单介绍及运用
- 实现自定义的BaseAdapter
- Adapter,BaseAdapter和ListView
- 自定义Adapter:BaseAdapter
- 万能BaseAdapter的优化,Adapter的优化之篇一
- Android ListView理解,BaseAdapter,ListView 的adapter用法和理解
- Android中关于Adapter的使用(下)BaseAdapter
- Android 利用BaseAdapter定制属于自己的adapter
- BaseAdapter抽取更精简的Adapter,方便复用
- bootstrap (active类)切换
- AndroidStudio引入第三方库导致的包冲突解决
- openfalcon监控端口大全
- python实例1:创建一个登陆模块
- iOS一行代码让你的应用中UIScrollView的滑动与侧滑返回并存
- 基于BaseAdapter的安卓百变Adapter实现
- 介绍X-MODEM协议和Y-MODEM,Z-MODEM的区别
- Oracle日期加减计算 方法汇总
- SwipeRefreshLayout中嵌套RelativeLayout或者LinearLayout的异常
- eclipse常用操作
- 树莓派大家各类服务器
- eclipse安装svn失败得解决方法
- VMware虚拟机启动报错,无法执行64位操作
- 第十周 项目三-树和二叉树的例题