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

版本

版本号 修订时间 更新内容 v 1.0 2017-11-28 初稿 v 1.1 2017-11-29 追加目录

声明

限于作者水平有限,出错难免,请积极拍砖!
欢迎任何形式的转载,转载请保留本文原文链接:http://blog.csdn.net/jefshi/article/details/78658099

结言

老早就有这些封装了,只是一直没发到博客中,现在补上吧。
有些地方可能写的仍然不够好,比如长时间不用,还得看 Demo 才能快速顺利的写出来。这点与我的原设想不一致。

原创粉丝点击