关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android RecyclerView 通用适配器的实现

    Android RecyclerView 通用适配器的实现

    2015-10-15 00:00:00 出处:lightSky Blog
    分享

    分析

    我们需要在RecyclerViewAdapter内部维持一个数据集合的引用 需要实现Item的点击事件,包括短按和长按,并需要向外部提供设置监听器的方法 这个适配器必须通用,所以应该是泛型的,并且viewHolder也是通用的,可以采用SparseArray维持View的所有集合 在RecyclerViewAdapter内部需要实现数据的绑定(抽象方法,延迟到子类实现),监听器的绑定

    编写监听器

    分为短按事件和长按事件

    短按监听器

    package cn.edu.zafu.base.adapter.listener;
    
    import android.view.View;
    
    /**
     * Created by lizhangqu on 2015/6/3.
     */
    public interface OnItemClickListener<T> {
        void onClick(View view, T item);
    }

    长按监听器

    package cn.edu.zafu.base.adapter.listener;
    
    import android.view.View;
    
    /**
     * Created by lizhangqu on 2015/6/3.
     */
    public interface OnItemLongClickListener<T> {
        void onLongClick(View view, T item);
    }

    编写通用适配器

    设置监听器

    package cn.edu.zafu.base.adapter;
    
    import android.support.v7.widget.RecyclerView;
    import android.util.SparseArray;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.List;
    
    import cn.edu.zafu.base.adapter.listener.OnItemClickListener;
    import cn.edu.zafu.base.adapter.listener.OnItemLongClickListener;
    
    /**
     * this is a BaseAdapter for RecyclerView
     * author lizhangqu
     * version 1.0
     * date 2015/6/3.
     */
    public abstract class BaseRecyclerViewAdapter<T, VH extends BaseRecyclerViewAdapter.SparseArrayViewHolder> extends RecyclerView.Adapter<VH> {
    
        /**
         * click listener
         */
        protected OnItemClickListener mOnItemClickListener;
        /**
         * long click listener
         */
        protected OnItemLongClickListener mOnItemLongClickListener;
    
        /**
         * set a long click listener
         *
         * @param onItemLongClickListener
         */
        public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
            mOnItemLongClickListener = onItemLongClickListener;
        }
    
        /**
         * set a click listener
         *
         * @param onItemClickListener
         */
        public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
            mOnItemClickListener = onItemClickListener;
        }
    
    }

    编写构造方法,将数据集合进行赋值

        /**
         * data
         */
        protected List<T> mList;
    
        /**
         * @param list the datas to attach the adapter
         */
        public BaseRecyclerViewAdapter(List<T> list) {
            mList = list;
        }

    实现几个必要的方法,比如获得Item以及覆写getItemCount方法

    /**
     * get a item by index
     *
     * @param position
     * @return
     */
    protected T getItem(int position) {
        return mList.get(position);
    }
    
    @Override
    public int getItemCount() {
        return mList.size();
    }

    实现将布局文件映射成View的方法

      /**
         * inflate a view by viewgroup ,id ,etc
         *
         * @param viewGroup
         * @param layoutId
         * @return
         */
        protected View inflateItemView(ViewGroup viewGroup, int layoutId) {
            return inflateItemView(viewGroup, layoutId, false);
        }
    
        /**
         * inflate a view by viewgroup ,id ,etc
         *
         * @param viewGroup
         * @param layoutId
         * @param attach
         * @return
         */
        protected View inflateItemView(ViewGroup viewGroup, int layoutId, boolean attach) {
            return LayoutInflater.from(viewGroup.getContext()).inflate(layoutId, viewGroup, attach);
        }

    实现onBindViewHolder方法,这一步很重要,将具体实现抽取到两个方法中去实现,bindDataToItemView是一个抽象方法,延迟到子类实现,bindItemViewClickListener方法设置监听器

     /**
         * a final function to avoid you override
         * use template design pattern
         *
         * @param vh
         * @param position
         */
        @Override
        public final void onBindViewHolder(VH vh, int position) {
            final T item = getItem(position);
            bindDataToItemView(vh, item);
            bindItemViewClickListener(vh, item);
        }
    
        /**
         * bind data to itemview
         *
         * @param vh   viewholder
         * @param item item
         */
        protected abstract void bindDataToItemView(VH vh, T item);
        /**
         * bind click listner to itemview
         *
         * @param vh   viewholder
         * @param item item
         */
        protected final void bindItemViewClickListener(VH vh, final T item) {
            if (mOnItemClickListener != null) {
                vh.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        mOnItemClickListener.onClick(view, item);
                    }
                });
            }
            if (mOnItemLongClickListener != null) {
                vh.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        mOnItemLongClickListener.onLongClick(v, item);
                        return true;
                    }
                });
            }
        }

    实现通用ViewHolder,内部使用SparseArray维持View对象

        public static class SparseArrayViewHolder extends RecyclerView.ViewHolder {
            private final SparseArray<View> views;
    
            public SparseArrayViewHolder(View itemView) {
                super(itemView);
                views = new SparseArray<View>();
            }
    
            public <T extends View> T getView(int id) {
                View view = views.get(id);
                if (view == null) {
                    view = itemView.findViewById(id);
                    views.put(id, view);
                }
                return (T) view;
            }
        }

    内部实现了一个泛型的getView方法,其作用就是将View缓存至SparseArray中去

    实现通用ViewHolder的一些属性设置方法,采用链式调用,返回this对象

          public SparseArrayViewHolder setText(int viewId, String value) {
                TextView view = getView(viewId);
                view.setText(value);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setTextColor(int viewId, int textColor) {
                TextView view = getView(viewId);
                view.setTextColor(textColor);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setImageResource(int viewId, int imageResId) {
                ImageView view = getView(viewId);
                view.setImageResource(imageResId);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setBackgroundColor(int viewId, int color) {
                View view = getView(viewId);
                view.setBackgroundColor(color);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setBackgroundResource(int viewId, int backgroundRes) {
                View view = getView(viewId);
                view.setBackgroundResource(backgroundRes);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setVisible(int viewId, boolean visible) {
                View view = getView(viewId);
                view.setVisibility(visible   View.VISIBLE : View.GONE);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setOnClickListener(int viewId, View.OnClickListener listener) {
                View view = getView(viewId);
                view.setOnClickListener(listener);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {
                View view = getView(viewId);
                view.setOnTouchListener(listener);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
                View view = getView(viewId);
                view.setOnLongClickListener(listener);
                return SparseArrayViewHolder.this;
            }
    
            public SparseArrayViewHolder setTag(int viewId, Object tag) {
                View view = getView(viewId);
                view.setTag(tag);
                return SparseArrayViewHolder.this;
            }

    源码

    参见github地址:https://github.com/lizhangqu
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。