美文网首页
Android RecycleView详解

Android RecycleView详解

作者: AKyS佐毅 | 来源:发表于2017-11-09 16:29 被阅读0次

    1、RecycleView简介

    • 是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item的回收复用的功能。

    2、RecycleView的优点

    • RecycleView 是ListView的升级版
    • RecycleView封装了ViewHolder的回收复用。
    • 提供了一种插拔式的体验,高度解耦,异常灵活。
      • LinearLayoutManager : 横向或者纵向的滑动的列表
      • GridLayoutManager: 类似GridView的效果
      • StaggeredGridLayoutManager: 可以实现瀑布流的效果
    • 可以控制item增删的动画,并支持自定义动画。

    重点: 编写Adapter

    • 创建一个类,继承RecycleView.Adapter
    • 继承三个方法:
      • onCreateViewHolder() 创建视图
      • onBindViewHolder() 填充数据
      • getItemCount() 获取数据
    继承RecycleView.Adapter
    • 写Item的xml 布局
    • 给Item填充数据

    设置Item 的高度

    • 继承RecycleView.ItemDecoration
    • 重写getItemOffsets的方法
    • 对参数outRect赋值
    设置item的间距 设置间隔线

    显示多种不同的布局

    • 在实体类中添加类型字段
    • 复写getItemViewType方法,返回具体类型
    • 通过返回类型判断加载不同的ViewHolder
    • 填充数据

    上下拉刷新操作

    • 下拉刷新控件

      • 使用SwipeRefreshLayout
    • 设置适配器

      基础的展示适配器
    • 在此基础上封装上下拉操作逻辑

    public class LoadMoreWrapper extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    
        private RecyclerView.Adapter adapter;
    
        // 普通布局
        private final int TYPE_ITEM = 1;
        // 脚布局
        private final int TYPE_FOOTER = 2;
        // 当前加载状态,默认为加载完成
        private int loadState = 2;
        // 正在加载
        public final int LOADING = 1;
        // 加载完成
        public final int LOADING_COMPLETE = 2;
        // 加载到底
        public final int LOADING_END = 3;
    
        public LoadMoreWrapper(RecyclerView.Adapter adapter) {
            this.adapter = adapter;
        }
    
        @Override
        public int getItemViewType(int position) {
            // 最后一个item设置为FooterView
            if (position + 1 == getItemCount()) {
                return TYPE_FOOTER;
            } else {
                return TYPE_ITEM;
            }
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // 通过判断显示类型,来创建不同的View
            if (viewType == TYPE_FOOTER) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.layout_refresh_footer, parent, false);
                return new FootViewHolder(view);
            } else {
                return adapter.onCreateViewHolder(parent, viewType);
            }
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            if (holder instanceof FootViewHolder) {
                FootViewHolder footViewHolder = (FootViewHolder) holder;
                switch (loadState) {
                    case LOADING: // 正在加载
                        footViewHolder.pbLoading.setVisibility(View.VISIBLE);
                        footViewHolder.tvLoading.setVisibility(View.VISIBLE);
                        footViewHolder.llEnd.setVisibility(View.GONE);
                        break;
    
                    case LOADING_COMPLETE: // 加载完成
                        footViewHolder.pbLoading.setVisibility(View.INVISIBLE);
                        footViewHolder.tvLoading.setVisibility(View.INVISIBLE);
                        footViewHolder.llEnd.setVisibility(View.GONE);
                        break;
    
                    case LOADING_END: // 加载到底
                        footViewHolder.pbLoading.setVisibility(View.GONE);
                        footViewHolder.tvLoading.setVisibility(View.GONE);
                        footViewHolder.llEnd.setVisibility(View.VISIBLE);
                        break;
    
                    default:
                        break;
                }
            } else {
                adapter.onBindViewHolder(holder, position);
            }
        }
    
        @Override
        public int getItemCount() {
            return adapter.getItemCount() + 1;
        }
    
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
            RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
            if (manager instanceof GridLayoutManager) {
                final GridLayoutManager gridManager = ((GridLayoutManager) manager);
                gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                    @Override
                    public int getSpanSize(int position) {
                        // 如果当前是footer的位置,那么该item占据2个单元格,正常情况下占据1个单元格
                        return getItemViewType(position) == TYPE_FOOTER ? gridManager.getSpanCount() : 1;
                    }
                });
            }
        }
    
        private class FootViewHolder extends RecyclerView.ViewHolder {
    
            ProgressBar pbLoading;
            TextView tvLoading;
            LinearLayout llEnd;
    
            FootViewHolder(View itemView) {
                super(itemView);
                pbLoading = (ProgressBar) itemView.findViewById(R.id.pb_loading);
                tvLoading = (TextView) itemView.findViewById(R.id.tv_loading);
                llEnd = (LinearLayout) itemView.findViewById(R.id.ll_end);
            }
        }
    
        /**
         * 设置上拉加载状态
         *
         * @param loadState 0.正在加载 1.加载完成 2.加载到底
         */
        public void setLoadState(int loadState) {
            this.loadState = loadState;
            notifyDataSetChanged();
        }
    }
    

    数据的添加、删除、刷新、动画

    • 为 RecycleView添加动画:
      recycleView.setItemAnimator(new DefaultItemAnimator());

    • 增加动画:
      notifyItemInserted(position)

    • 删除动画:
      notifyItemRemoved(position)

    相关文章

      网友评论

          本文标题:Android RecycleView详解

          本文链接:https://www.haomeiwen.com/subject/hlzpmxtx.html