Android 各类 Adapter 封装
来源:互联网 发布:淘宝客贷款哪里进 编辑:程序博客网 时间:2024/06/01 12:03
Android 各类 Adapter 封装
各类 Adapter 封装,包括:BaseAdapter、PagerAdapter、FragmentPagerAdapter
持续更新中
前言
不废话,直接源代码,自行阅读。认可的自行收藏使用
目录
一、BaseAdapter: ListView, GridView, Spinner
- API
- 封装类
- Demo
二、PagerAdapter: ViewPager
- API
- 封装类
- Demo
三、FragmentPagerAdapter: ViewPager + Fragment
- API
- 封装类
- Demo
一、BaseAdapter: ListView, GridView, Spinner
1. API
- void addObject(List objects, boolean clear)
- void addObject(T object)
- void removeObject(T object)
- void clearObject()
- List getObjects()
2. 封装类
/** * Description: AbsListView 适配器 * <p>Create Date: 2016-10-31 * <p>Modify Date: 2017-11-28 * * @author csp * @version 1.0.2 * @since AndroidLibrary 1.0.0 */@SuppressWarnings({"unused", "WeakerAccess"})public abstract class BaseListAdapter<T> extends BaseAdapter { private List<T> objects; // 数据源 private int[] resources; // 模板文件: R.selector_item_background private LayoutInflater inflater; // 解析XML布局资源的填充器 // ======================================== // 构造方法,Getter,Setter // ======================================== public BaseListAdapter(Context context, List<T> objects, int[] layoutId) { this.objects = new ArrayList<>(); this.resources = layoutId; this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); // 添加数据 addObject(-1, objects, false); } public BaseListAdapter(Context context, List<T> objects, int layoutId) { this(context, objects, new int[]{layoutId}); } public List<T> getObjects() { return objects; } // ======================================== // 数据源操作方法 // ======================================== /** * 追加数据源(不刷新UI) * * @param position 添加位置, -1: 添加在末尾 * @param objects 数据 * @param clear true: 清空数据后,再设置数据源 */ public void addObject(int position, List<T> objects, boolean clear) { if (clear) this.objects.clear(); if (objects == null || objects.isEmpty()) return; if (position < 0) this.objects.addAll(objects); else this.objects.addAll(position, objects); } /** * @see #addObject(int, List, boolean) */ public void addObject(List<T> objects, boolean clear) { addObject(-1, objects, clear); } /** * @see #addObject(int, List, boolean) */ public void addObject(int position, T object, boolean clear) { if (clear) this.objects.clear(); if (object == null) return; if (position < 0) this.objects.add(object); else this.objects.add(position, object); } /** * @see #addObject(int, Object, boolean) */ public void addObject(T object) { addObject(-1, object, false); } /** * 删除数据源 */ public void removeObject(T object) { objects.remove(object); } /** * 清空数据源 */ public void clearObject() { objects.clear(); } // ======================================== // getView() // ======================================== @Override public int getCount() { return objects.size(); } @Override public T getItem(int position) { return objects.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getViewTypeCount() { return resources.length; } /** * 构建[Item] * 注: 首屏显示数据时, [getView()]方法会执行四遍, 而不是一遍, 这可能会导致空指针错误 * * @param position 当前[Item]在[ListView]中的绝对位置 * @param convertView 当前[Item]对象(旧, 被复用前) * @param parent [ListView]的父节点[ViewGroup]对象 * @return 当前[Item]对象 */ @Override public View getView(int position, View convertView, ViewGroup parent) { // 1) 获取当前[Item]对象 convertView = getConvertView(position, convertView, parent); // 2) 获取当前[Item]的数据 T object = getItem(position); // 3) 绑定当前[Item]内容对象 BaseViewHolder vHolder = getViewHolder(convertView); if (vHolder == null) { vHolder = getNewViewHolder(convertView); bindViewHolder(convertView, vHolder); } // 4) 设置当前[Item]内容对象 vHolder.setPosition(position); vHolder.onRefreshViewContent(object); return convertView; } /** * 获取当前[Item]对象 * <p>重复利用,防止反复创建的资源消耗 */ private View getConvertView(int position, View convertView, ViewGroup parent) { if (convertView == null) { int type = getItemViewType(position); convertView = inflater.inflate(resources[type], parent, false); } return convertView; } /** * 当前[Item]对象绑定对应的内容对象[ViewHolder] * * @param view 当前[Item]对象 * @param vHolder 当前[Item]内容对象 */ private void bindViewHolder(View view, BaseViewHolder vHolder) { view.setTag(vHolder); } /** * 获取当前[Item]上绑定的内容对象[ViewHolder] * * @param view 当前[Item] */ @SuppressWarnings("unchecked") public <V extends BaseViewHolder> V getViewHolder(View view) { return (V) view.getTag(); } // ======================================== // Item 内容设置: ViewHolder 封装 // ======================================== /** * [Item]内容对象 */ protected abstract class BaseViewHolder { private View view; // 当前[Item]对象 private int position; protected BaseViewHolder(View view) { this.view = view; position = 0; initView(); initViewEvent(); } public int getPosition() { return position; } private void setPosition(int position) { this.position = position; } /** * [Item]对象的初始化 */ protected abstract void initView(); /** * [Item]对象的事件绑定 */ protected abstract void initViewEvent(); /** * [Item]对象的内容设置 * * @param object 内容数据 */ protected abstract void onRefreshViewContent(T object); /** * @link View.findViewById(int) */ @SuppressWarnings("unchecked") protected <V> V findViewById(int resId) { return (V) view.findViewById(resId); } } /** * 获取[ViewHolder]对象 * * @param view 当前[Item] */ protected abstract BaseViewHolder getNewViewHolder(View view);}
- 对于复杂多布局的使用可能存在问题
3. Demo
支持多布局,作者比较偷懒,多布局 Demo 请自行联想
DemoListAdapter.java
/** * Description: ListView 适配器 Demo * <p>Create Date: 2016-10-31 * <p>Modify Date: 2017-07-04 * * @author csp * @version 1.0.1 * @since AndroidLibrary 1.0.0 */@SuppressWarnings("unused")public class DemoListAdapter extends BaseListAdapter<Object> { public DemoListAdapter(Context context) { this(context, null); } public DemoListAdapter(Context context, List<Object> objects) { // super(context, objects, R.layout.item); super(context, objects, 0); } private void refreshViewContent(ViewHolder vHolder, Object object) { // TODO 设置[item]内容 } private void setViewEvent(final ViewHolder vHolder) { // TODO 设置[item]事件 } // ======================================== // Item 内容设置: ViewHolder 封装 // ======================================== private class ViewHolder extends BaseViewHolder { // private TextView txt; // private ImageView img; private ViewHolder(View view) { super(view); } @Override protected void initView() { // txt = findViewById(R.id.txt); // img = findViewById(R.id.img); } @Override protected void initViewEvent() { setViewEvent(this); } @Override protected void onRefreshViewContent(Object object) { refreshViewContent(this, object); } } @Override protected BaseViewHolder getNewViewHolder(View view) { return new ViewHolder(view); }}
res/layout/item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/txt" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout>
二、PagerAdapter: ViewPager
1. API
- void addObject(List objects, boolean clear)
- void addObject(T object)
- void removeObject(T object)
- void clearObject()
- List getObjects()
2. 封装类
/** * Description: ViewPager 适配器 * Create Date: 2016-10-31 * Modify Date: 2017-06-13 * * @author csp * @version 1.0.1 * @since AndroidLibrary 1.0.0 */@SuppressWarnings("unused")public abstract class BasePagerAdapter<T> extends PagerAdapter { private Context context; private List<T> objects; // 数据源 // ======================================== // 构造方法,Getter,Setter // ======================================== public BasePagerAdapter(Context context, List<T> objects) { this.context = context; this.objects = new ArrayList<>(); addObject(-1, objects, false); } public Context getContext() { return context; } public List<T> getObjects() { return objects; } // ======================================== // 数据源操作方法 // ======================================== /** * 追加数据源(不刷新UI) * * @param position 添加位置, -1: 添加在末尾 * @param objects 数据 * @param clear true: 清空数据后,再设置数据源 */ public void addObject(int position, List<T> objects, boolean clear) { if (clear) this.objects.clear(); if (objects == null || objects.isEmpty()) return; if (position < 0) this.objects.addAll(objects); else this.objects.addAll(position, objects); } /** * @see #addObject(int, List, boolean) */ public void addObject(List<T> objects, boolean clear) { addObject(-1, objects, clear); } /** * @see #addObject(int, List, boolean) */ public void addObject(int position, T object, boolean clear) { if (clear) this.objects.clear(); if (object == null) return; if (position < 0) this.objects.add(object); else this.objects.add(position, object); } /** * @see #addObject(int, Object, boolean) */ public void addObject(T object) { addObject(-1, object, false); } /** * 删除数据源 */ public void removeObject(T object) { objects.remove(object); } /** * 清空数据源 */ public void clearObject() { objects.clear(); } /** * @see android.widget.BaseAdapter#getItem(int) */ public T getItem(int position) { return objects.get(position); } // ======================================== // instantiateItem(), 以[key / valuew], 形式存储数据 // ======================================== /** * 判断是否显示[item],true: 表示[item]与[key]为同一键值对,显示该[item] * * @param view [item]对象 * @param key [item]的[key] * @return boolean true: 显示[item] */ @Override public boolean isViewFromObject(View view, Object key) { return key == view; } @Override public int getCount() { return objects.size(); } /** * 创建[item/value], 并添加到[ViewPager], 同时返回[key] * * @param container 指[ViewPager] * @param position [item]的位置 * @return Object [item]的[key] */ @Override public Object instantiateItem(ViewGroup container, int position) { View view = getView(container, position); container.addView(view); return view; } /** * 销毁[item] * * @param container 指[ViewPager] * @param position 当前[item]的位置 * @param key 当前[item]的Key */ @Override public void destroyItem(ViewGroup container, int position, Object key) { container.removeView((View) key); } /** * 创建[item]对象 */ protected abstract View getView(ViewGroup container, int position);}
3. Demo
/** * Description: ViewPager 适配器 Demo * Create Date: 2016-10-31 * Modify Date: 2017-11-28 * * @author csp * @version 1.0.1 * @since AndroidLibrary 1.0.0 */@SuppressWarnings("unused")public class DemoPagerAdapter extends BasePagerAdapter<Integer> { public DemoPagerAdapter(Context context, List<Integer> object) { super(context, object); } @Override protected View getView(ViewGroup container, int position) { // TODO 创建[item]对象,并设置相应内容事件等 Integer id = getItem(position); // ImageView view = (ImageView) View.inflate(getContext(), R.layout.img, null); ImageView view = new ImageView(getContext()); view.setImageResource(id); return view; }}
三、FragmentPagerAdapter: ViewPager + Fragment
1. API
- void addObject(List objects, boolean clear)
- void addObject(T object)
- void removeObject(T object)
- void clearObject()
- List getObjects()
2. 封装类
/** * Description: ViewPager + Fragment 适配器 * Create Date: 2016-10-31 * Modify Date: 2016-06-13 * * @author csp * @version 1.0.0 * @since AndroidLibrary 1.0.0 */@SuppressWarnings("unused")public class BaseFragmentPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragments; // 数据源 // ======================================== // 构造方法,Getter,Setter // ======================================== public BaseFragmentPagerAdapter(FragmentActivity fa, List<Fragment> fragments) { super(fa.getSupportFragmentManager()); this.fragments = new ArrayList<>(); addFragment(-1, fragments, false); } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } // ======================================== // 数据源操作方法 // ======================================== /** * 追加数据源(不刷新UI) * * @param position 添加位置, -1: 添加在末尾 * @param objects 数据 * @param clear true: 清空数据后,再设置数据源 */ public void addFragment(int position, List<Fragment> objects, boolean clear) { if (clear) this.fragments.clear(); if (objects == null || objects.isEmpty()) return; if (position < 0) this.fragments.addAll(objects); else this.fragments.addAll(position, objects); } /** * @see #addFragment(int, List, boolean) */ public void addFragment(List<Fragment> objects, boolean clear) { addFragment(-1, objects, clear); } /** * @see #addFragment(int, List, boolean) */ public void addFragment(int position, Fragment object, boolean clear) { if (clear) this.fragments.clear(); if (object == null) return; if (position < 0) this.fragments.add(object); else this.fragments.add(position, object); } /** * @see #addFragment(int, Fragment, boolean) */ public void addFragment(Fragment object) { addFragment(-1, object, false); } /** * 删除数据源 */ public void removeFragment(Fragment object) { fragments.remove(object); } /** * 清空数据源 */ public void clearFragment() { fragments.clear(); }}
3. Demo
无
版本
声明
限于作者水平有限,出错难免,请积极拍砖!
欢迎任何形式的转载,转载请保留本文原文链接:http://blog.csdn.net/jefshi/article/details/78658099
结言
老早就有这些封装了,只是一直没发到博客中,现在补上吧。
有些地方可能写的仍然不够好,比如长时间不用,还得看 Demo 才能快速顺利的写出来。这点与我的原设想不一致。
阅读全文
0 0
- Android 各类 Adapter 封装
- Android 各类Adapter总结
- Android中的Adapter封装
- android adapter封装
- Android 通用Adapter封装
- android 简单的adapter封装
- Android---封装ListView的Adapter
- android RecycleView Adapter简单封装
- Android 封装RecyclerView的Adapter
- Android Adapter的简单封装
- Android RecyclerView通用Adapter封装
- Android之Adapter的封装与抽象
- Android万能适配器(二)封装Adapter
- Android ListView,GridView的Adapter封装
- ListView Adapter 封装 打造Android 万能适配器
- Android 封装RecyclerView.Adapter,省其ViewHolder
- Android 对封装RecyclerView.Adapter讲解
- 封装adapter
- 析构函数声明为私有的作用
- 现代操作系统之文件系统(中)
- Oracle中将毫秒类型时间转换以及取到毫秒时间类型的解决办法
- 如何写出优美的C代码
- kafka java demo
- Android 各类 Adapter 封装
- netty学习笔记
- Kaldi中如何使用已经训练好的模型进行语音识别ASR呢?
- 升级Gradle 3.0遇到的坑
- 我心故我在
- 高阶函数式编程
- Java 多线程读取一个文件
- 你总要一个人 走过一段艰难的日子
- 面向过程与面向对象的区别