RecyclerView 的 RecyclerView.Adapter 通用版的实现

RecyclerView 的 RecyclerView.Adapter 通用版的实现(有加载更多的功能)

Android5.0给我们带来了RecyclerView 他的灵活性非常强,可以替代Listview和GridView,本文主要说说他的适配器的使用,下面是自己封装的一个通用版的适配器(),废话不多说,看代码:
//这个Adapter里面有两个抽象方法
    public abstract class MyRecycleViewAdapter<T> extends RecyclerView.Adapter {

    private static final int TYPE_ITEM = 10;
    private static final int TYPE_FOOTER = 11;
    private List<T> list;//数据集合
    private int itemLayout;//item的布局
    private Context context;
    private boolean isNeedMore;//是否需要加载更多的view

    public boolean isNeedMore() {
        return isNeedMore;
    }

    public void setIsNeedMore(boolean isNeedMore) {
        this.isNeedMore = isNeedMore;
    }

    /**
     * item的点击和长按监听
     */
    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }
    private OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }
    //构造器list:要加载的数据集合,itemlayout:item的布局(R.layout.item),isNeedMore:是否需要加载更多的功能(false:不需要,true:需要)
    public MyRecycleViewAdapter(List<T> list,int itemLayout,Context context,boolean isNeedMore){
        this.list = list;
        this.itemLayout = itemLayout;
        this.context = context;
        this.isNeedMore = isNeedMore;
    }

    public List<T> getList() {
        return list;
    }
    public void setList(List<T> list) {
        this.list = list;
    }
    public int getItemLayout() {
        return itemLayout;
    }
    public void setItemLayout(int itemLayout) {
        this.itemLayout = itemLayout;
    }

    @Override
    public int getItemViewType(int position) {
        if(!isNeedMore) {
            return super.getItemViewType(position);
        }
        if (position + 1 == getItemCount()) {
            return TYPE_FOOTER;
        } else {
            return TYPE_ITEM;
        }
    }

    //1、第一步,先在onCreateViewHolder里面添加item的布局,添加到RecyclerView里面
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if(viewType == TYPE_FOOTER) {
            //返回加载更多的布局的holder
                return new FooterViewHolder(
                        LayoutInflater.from(parent.getContext()).inflate(
                        R.layout.recycle_foot_view, parent, false));
            }else {
            //返回item的布局的holder
                View view = LayoutInflater.from(context).inflate(itemLayout, parent, false);
                return new MyViewHolder(view);
            }
    }

    //3、第三步,把ViewHolder传递到onBindViewHolder,进行item的数据绑定
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
            //((MyViewHolder) holder).item.setText(position + "");
            if(TYPE_ITEM == getItemViewType(position)
                    || super.getItemViewType(position) == getItemViewType(position)) {
                Log.e("TAG", "自定义的adapter的item设置点击事件");
                    //当然这里也可以使用里面写的自定义接口的方法来实现,本人觉得
                    //这样在使用的时候会更简洁,不需要设置adapter的监听
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        setPositionClick(position);
                    }
                });
                //长按监听
               holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        return false;
                    }
                });
                initData((MyViewHolder) holder, position);
            }
//            holder.itemView.setOnClickListener(new View.OnClickListener() {
//                @Override
//                public void onClick(View v) {
//                    int position = holder.getLayoutPosition();
//                    onItemClickListener.onItemClick(holder.itemView, position);
//                }
//            });
//            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
//                @Override
//                public boolean onLongClick(View v) {
//                    int position = holder.getLayoutPosition();
//                    onItemClickListener.onItemLongClick(holder.itemView, position);
//                    return false;
//                }
//            });

    }

    @Override
    public int getItemCount() {
            if(isNeedMore) {
                return list.size()==0?0:list.size()+1;
            }else {
                return list.size();
            }
    }

    /**
     *itemview 的点击事件(抽象方法)
     * @param position
     */
    protected abstract void setPositionClick(int position);

    /**
     * 对item进行加载数据
     * @param holder recycleview的ViewHolder position位置
     * @param position
     */
    protected abstract void initData(MyViewHolder holder, int position);

    //2、第二步:在ViewHolder里面初始化视图
    //如果你的item布局里面有别的视图可以自己添加对应的方法就是了
    //目前里面没有写那么多
    public class MyViewHolder extends RecyclerView.ViewHolder {

        private View findView;
        private View convertView;
        private SparseArray<Object> tags;
        //用来替代Map<Integer,Object>的容器, 效率比map高
        private SparseArray<View> views;

        public MyViewHolder(View itemView) {
            super(itemView);
            this.convertView = itemView;
            this.findView = itemView;
            tags = new SparseArray<>();
            views = new SparseArray<View>();
        }

        public View getConverView() {
            return convertView;
        }

        public View getFindView() {
            return findView;
        }
        //    /**
        //     * 根据视图id得到对应的视图对象
        //     * @param viewId
        //     * @return
        //     */
        //    public <T extends View> T getView(@IdRes int viewId) {
        //        View view = views.get(viewId);
        //        if (view == null) {
        //            view = convertView.findViewById(viewId);
        //            views.put(viewId, view);
        //        }
        //        return (T) view;
        //    }
                /**
                 * 根据 viewId 获取一个 View 对象
                 */
        //    public View getView(@IdRes int viewId) {
        //        View view;
        //        Object viewObj = findView.getTag(viewId);
        //        if (null != viewObj) {
        //            view = (View) viewObj;
        //        } else {
        //            view = findView.findViewById(viewId);
        //            findView.setTag(viewId, view);
        //        }
        //        return view;
        //    }
        public <T extends View> T  getView(@IdRes int viewId) {
            View view;
            Object viewObj = findView.getTag(viewId);
            if (null != viewObj) {
                view = (View) viewObj;
            } else {
                view = findView.findViewById(viewId);
                findView.setTag(viewId, view);
            }
            return (T) view;
        }

        /**
         * 设置指定的id视图的可见性
         * @param viewId
         * @param visibility
         * @return
         */
        public MyViewHolder setViewVisibility(@IdRes int viewId,int visibility){
            if(getView(viewId)!=null) {
                getView(viewId).setVisibility(visibility);
            }
            return this;
        }
        /**
         * 根据 viewId 获取一个 ImageView 对象
         */
        public ImageView getImageView(@IdRes int viewId) {
            return (ImageView) getView(viewId);
        }

        /**
         * 根据 viewId 获取一个 TextView 对象
         */
        public TextView getTextView(@IdRes int viewId) {
            return (TextView) getView(viewId);
        }

        /**
         * 根据 viewId 获取一个 CheckBox 对象
         */
        public CheckBox getCheckBox(@IdRes int viewId) {
            return (CheckBox) getView(viewId);
        }

        /**
         * 为指定 viewId 的 ImageView 对象设置图片
         */
        public MyViewHolder setImageDrawable(@IdRes int viewId, @Nullable Drawable drawable) {
            if (getImageView(viewId)!=null) {
                getImageView(viewId).setImageDrawable(drawable);
            }
            return this;
        }

        /**
         * 为指定 viewId 的 ImageView 对象设置图片
         */
        public MyViewHolder setImageResource(@IdRes int viewId, @DrawableRes int resId) {
            if (getImageView(viewId)!=null) {
                getImageView(viewId).setImageResource(resId);
            }
            return this;
        }
        /**
         * 为指定 viewId 的 ImageView 对象设置图片
         */
        public MyViewHolder setImageBitmap(@IdRes int viewId, Bitmap bitmap) {
            if (getImageView(viewId)!=null) {
                getImageView(viewId).setImageBitmap(bitmap);
            }
            return this;
        }

        /**
         * 未指定的viewId 的ImageView 对象设置背景图片
         * @param viewId
         * @param drawable
         * @return
         */
        public MyViewHolder setImageBackgroud(@IdRes int viewId, @Nullable Drawable drawable) {
            if (getImageView(viewId)!=null) {
                getImageView(viewId).setBackground(drawable);
            }
            return this;
        }
        /**
         * 使用 xUtils 为指定 viewId 的 ImageView 对象设置图片
         */
        public MyViewHolder bindImage(@IdRes int viewId, @NonNull String url) {
            bindImage(viewId, url, null);
            return this;
        }

        /**
         * 使用 xUtils 为指定 viewId 的 ImageView 对象设置图片
         */
        public MyViewHolder bindImage(@IdRes int viewId, @NonNull String url, ImageOptions options) {
            if (getImageView(viewId)!=null) {
                x.image().bind(getImageView(viewId), url, options);
            }

            return this;
        }

        /**
         * 为指定 viewId 的 TextView 对象设置文字
         */
        public MyViewHolder setText(@IdRes int viewId, @StringRes int resid) {
            if (getTextView(viewId)!=null) {
                getTextView(viewId).setText(resid);
            }
            return this;
        }

        /**
         * 为指定 viewId 的 TextView 对象设置文字
         */
        public MyViewHolder setText(@IdRes int viewId, CharSequence text) {
            if (getTextView(viewId)!=null) {
                getTextView(viewId).setText(text);
            }
            return this;
        }

        public MyViewHolder setTextSize(@IdRes int viewId,@Size int size){
            if(getTextView(viewId) != null){
                getTextView(viewId).setTextSize(size);
            }
            return this;
        }

        /**
         * 为指定 viewId 的 TextView 对象设置文字颜色
         */
        public MyViewHolder setTextColor(@IdRes int viewId, @ColorInt int color) {
            if (getTextView(viewId)!=null) {
                getTextView(viewId).setTextColor(color);
            }
            return this;
        }

        /**
         * 为指定 viewId 的 View 对象设置 TAG
         */
        public MyViewHolder setTag(@IdRes int viewId, final Object tag) {
            if (getView(viewId)!=null) {
                getView(viewId).setTag(tag);
            }
            return this;
        }

        /**
         * 为指定 viewId 的 View 对象设置背景图片
         */
        public MyViewHolder setBackgroundResource(@IdRes int viewId, @DrawableRes int resid) {
            if (getView(viewId)!=null) {
                getView(viewId).setBackgroundResource(resid);
            }
            return this;
        }

        /**
         * 使用当前 ViewHolder 记录一个 TAG
         */
        public MyViewHolder putTag(int key, final Object tag) {
            tags.put(key, tag);
            return this;
        }

        /**
         * 从当前 ViewHolder 中取出一个TAG
         */
        public Object getTag(int key) {
            return tags.get(key);
        }

        /**
         * 为指定 viewId 的 CheckBox 对象设置选中状态
         */
        public MyViewHolder setChecked(@IdRes int viewId, boolean checked) {
            if (getCheckBox(viewId)!=null) {
                getCheckBox(viewId).setChecked(checked);
            }
            return this;
        }

        /**
         * 切换指定 viewId 的 CheckBox 的选中状态
         */
        public MyViewHolder toggle(@IdRes int viewId) {
            if (getCheckBox(viewId)!=null) {
                getCheckBox(viewId).toggle();
            }
            return this;
        }

        /**
         * 为指定 viewId 的 View 对象设置点击监听
         */
        public MyViewHolder setOnClickListener(@IdRes int viewId, @Nullable View.OnClickListener listener) {
            if (getView(viewId)!=null) {
                getView(viewId).setOnClickListener(listener);
            }

            return this;
        }

        /**
         * 为指定 viewId 的 View 对象设置是否可见
         */
        public MyViewHolder setVisibile(@IdRes int viewId, boolean visible) {
            if (getView(viewId)!=null) {
                getView(viewId).setVisibility(visible ? View.VISIBLE : View.GONE);
            }
            return this;
        }

        /**
         * 为指定 viewId 的 View 对象设置是否可见
         */
        public MyViewHolder setVisibility(@IdRes int viewId, int visibility) {
            if (getView(viewId)!=null) {
                getView(viewId).setVisibility(visibility);
            }
            return this;
        }

        /**
         * 为指定 viewId 的 View 对象设置布局参数
         */
        public MyViewHolder setLayoutParams(@IdRes int viewId, RelativeLayout.LayoutParams params) {
            if (getView(viewId)!=null) {
                getView(viewId).setLayoutParams(params);
            }
            return this;
        }
    }

    public class FooterViewHolder extends RecyclerView.ViewHolder {

        public FooterViewHolder(View itemView) {
            super(itemView);
        }
    }
}

在来说说具体的使用吧:

 private void setRecyclerView(final List data,int layout) {
        //线性布局管理器
        //false:不进行反转
        //true:进行反转
        final LinearLayoutManager manager = new LinearLayoutManager(ListActivity.this, LinearLayoutManager.VERTICAL, false);
        recycle.setLayoutManager(manager);
        recycle.setAdapter(new MyRecycleViewAdapter(data, layout, ListActivity.this, true) {
            @Override
            protected void setPositionClick(int position) {
                Intent intent = new Intent(ListActivity.this,DetailedInfoActivity.class);
                intent.putExtra("positions",positions);
                startActivity(intent);
            }

            @Override
            protected void initData(MyViewHolder holder, int position) {
                DetailsInfo info = (DetailsInfo) data.get(position);
                setHolderData(data,info,holder,position);
            }
        });
        //滚动监听,在滚动监听里面去实现加载更多的功能
        recycle.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int lastVisibleItemPosition = manager.findLastVisibleItemPosition();
                if (lastVisibleItemPosition + 1 == recycle.getAdapter().getItemCount()) {

                    if (!isLoading) {//一个布尔的变量,默认是false
                        isLoading = true;
                        Log.e("TAG", "page==" + page);
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                getDataFromeNet();
                            }
                        }, 2000);
                    } else if (page == 3) {
                    //当没有更多的数据的时候去掉加载更多的布局
                        MyRecycleViewAdapter adapter = (MyRecycleViewAdapter) recycle.getAdapter();
                        adapter.setIsNeedMore(false);
                        adapter.notifyDataSetChanged();
                    }
                }
            }
        });
    }

    private int page=0;

    /**
     * 上拉加载更多
     */
    private void getDataFromeNet() {
        for (int i = 0; i < 6; i++) {
            DetailsInfo detailsInfo = new DetailsInfo("宝马4S店"+i+i,"小李","2016.2.3","合格");
            data.add(detailsInfo);
        }
        page++;
        if(page!=3) {
            isLoading = false;
        }else {
            isLoading = true;
        }
        recycle.getAdapter().notifyDataSetChanged();
    }

好了一个简单的通用版有加载更多的adapter就实现啦,当你的项目中有好几个的列表的时候,不妨试试这个,能够减少你很多的工作量。

时间: 2024-08-26 10:30:53

RecyclerView 的 RecyclerView.Adapter 通用版的实现的相关文章

Android RecyclerView嵌套RecyclerView

原理 RecyclerView嵌套RecyclerView的条目,项目中可能会经常有这样的需求,但是我们将子条目设置为RecyclerView之后,却显示不出来.自己试了很久,终于找到了原因:必须先设置子RecylcerView的高度.你要花精力确定出子RecyclerView里面条目的高度,然后从而确定子RecyclerView的高度,设置给子RecylcerView,这样做RecyclerView就可以正确显示出子ReclyclerView. 效果 代码 首页布局就是一个竖直排列的Recyc

C# 给某个方法设定执行超时时间 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.BeginInvoke 来避免界面假死, 但是这样做时,某些代码或者是某个方法的执行超时的时间还是无法操控的.那么我们又是否有一种比较通用的方法.来设定某一个方法的执行超时的时间,让该其一旦超过指定时间则跳出指定方法.进而继续向下执行呢? 答案当然是肯定的. delegate.BeginInvoke可以实现代

三级下拉菜单 (通用版)

<html><head><title>阿里西西网页特效演示, 三级下拉菜单 (通用版)</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head><body> <SCRIPT LANGUAGE="JavaScript"><!--functi

Android中RecyclerView嵌套RecyclerView或嵌套ListView

Android中RecyclerView嵌套RecyclerView或嵌套ListView

AES加密解密通用版Object-C / C# / JAVA

1.无向量 128位 /// <summary> /// AES加密(无向量) /// </summary> /// <param name="plainBytes">被加密的明文</param> /// <param name="key">密钥</param> /// <returns>密文</returns> public static string AESEncry

XMwoods通用版权限管理系统 .net 联系QQ:847129860

XMwoods通用版权限管理系统 主要功能有:权限管理.角色管理.部门管理.用户管理.公司管理.模块管理.系统设置.一. 权限管理以关键字(Key)的方式来定义系统的权限,使系统权限分配更加贴合企业需求.提供给开发人员使用,权限的控制需要与系统功能的实现挂接.● 权限管理界面,可以进行系统权限的定义操作.● 用户权限管理,对用户权限进行自定义设置,也可以继承其他用户.角色 等权限.● 角色权限管理,对角色权限进行自定义设置,也可以继承其他角色 等权限.二.角色管理系统实现了内部员工户角色的统一管

通用版的上拉刷新下拉加载控件

通用版的上拉刷新下拉加载控件 适用于各种控件实现上拉刷新,下拉加载的功能. 下载地址:http://www.devstore.cn/code/info/964.html 运行截图:    

线程池代码(通用版)

一.适用场景 首先,必须明确一点,线程池不是万能的,它有其特定的使用场景.使用线程池是为了减小线程本身的开销对应用性能所产生的影响,但是其 前提是线程本身创建.销毁的开销和线程执行任务的开销相比是不可忽略的 .如果线程本身创建.销毁的开销对应用程序的性能可以忽略不计,那么使用/不使用线程池对程序的性能并不会有太大的影响. 线程池通常适合以下几种场景: ①.单位时间内处理的任务频繁,且任务时间较短 ②.对实时性要求较高.如果接收到任务之后再创建线程,可能无法满足实时性的要求,此时必须使用线程池.

旺旺绍兴游戏开挂作弊器助手通用版

旺旺绍兴游戏开挂作弊器助手通用版[微信号:qqgkj0130 无丨法乄丨打丨开][此乄乄信乄息乄永久乄有乄乄效][薇.信已开通]以实力求生存,以信誉求发展] 打不开请添加薇.信]"台美"日趋频繁热络联系 国台办:会自食其果联最新汽车遥控拦截 器怎么购买文基.金"的招募材料称,其所募资金主要用于获取南开国有资产经营有限(下称"南开国资")的80%股权,进行天津南开光电子城项目的一级土地整理,并以土地出让收入作为还款来源.2014年9月以后的工商资料显示,南开