首页 > 系统 > Android > 正文

Android RecyclerView + SwipeRefreshLayout 分页、下拉刷新

2019-11-09 18:02:12
字体:
来源:转载
供稿:网友

RecyclerView出现已经有一段时间了,可以通过导入support-v7对其进行使用。

据官方的介绍,该控件用于在有限的窗口中展示大量数据集,

其实这样功能的控件并不陌生,例如:ListView、GridView。

那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?

整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,

通过设置它提供的不同LayoutManager,

ItemDecoration , ItemAnimator实现非常炫的效果。

你想要控制其显示的方式,

请通过布局管理器LayoutManager你想要控制Item间的间隔(可绘制),

请通过ItemDecoration你想要控制Item增删的动画,

请通过ItemAnimator你想要控制点击、长按事件,自己实现。。。。。。。

实现非常简单

布局文件:

在RecyclerView包裹SwipeRefreshLayout

<android.support.v4.widget.SwipeRefreshLayout        android:id="@+id/swipe_refresh_widget"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_below="@+id/editTextRelayout">        <com.gsl.demo.utils.RefreshRecyclerView            android:id="@+id/recyclerView"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_below="@+id/editTextRelayout"            android:dividerHeight="18dp"            android:scrollbars="vertical" />    </android.support.v4.widget.SwipeRefreshLayout>

RefreshRecyclerView(自定义的view)

public class RefreshRecyclerView extends RecyclerView {    PRivate AutoLoadAdapter autoLoadAdapter;    public RefreshRecyclerView(Context context) {        this(context, null);    }    public RefreshRecyclerView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public RefreshRecyclerView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }    private boolean isLoadingMore = false;//是否正在加载更多    private OnLoadMoreListener loadMoreListener;//加载数据监听    private boolean loadMoreEnable = false;//是否允许加载更多    private int footerResource = -1;//脚布局    private boolean footer_visible = false;//脚部是否可以见    private void init() {        setOnScrollListener(new OnScrollListener() {            @Override            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {                super.onScrollStateChanged(recyclerView, newState);                if (getAdapter() != null && getLayoutManager() != null) {                    int lastVisiblePosition = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();                    int itemCount = getAdapter().getItemCount();                    /**                     * 控制下拉刷新回调                     * itemCount != 0 排除没有数据情况                     * lastVisiblePosition + 4 >= itemCount - 1 最后可见+4 >= 总条数 加载更多                     * distanceY < 0 为上拉的时候才刷新                     */                    if (distanceY < 0 && itemCount != 0 && lastVisiblePosition + 4 >= itemCount - 1 && !isLoadingMore && loadMoreEnable) {                        Log.i("test","加载更多");                        //正在加载更多                        loading();                        if (footerResource != -1){//有脚布局                            //显示脚布局                            footer_visible = true;                            getAdapter().notifyItemChanged(itemCount - 1);                        }                        if (loadMoreListener != null) {                            loadMoreListener.loadMoreListener();                        }                    }                }            }        });    }    /**     * 判断滑动方向     */    private float distanceY = 0;    float startY = 0;    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        float y = ev.getRawY();        switch (ev.getAction()){            case MotionEvent.ACTION_DOWN:                startY = y;                break;            case MotionEvent.ACTION_MOVE:                distanceY = y - startY;                startY = y;                break;        }        return super.dispatchTouchEvent(ev);    }    @Override    public void setAdapter(Adapter adapter) {        SlideInBottomAnimationAdapter slideInBottomAnimationAdapter = new SlideInBottomAnimationAdapter(adapter);        slideInBottomAnimationAdapter.setDuration(600);        autoLoadAdapter = new AutoLoadAdapter(slideInBottomAnimationAdapter);//添加动画        super.setAdapter(autoLoadAdapter);    }    /**     * 设置是否允许加载更多     *     * @param isEnable     */    public void setLoadMoreEnable(boolean isEnable) {        this.loadMoreEnable = isEnable;    }    /**     * 设置脚布局     */    public void setFooterResource(int footerResource) {        this.footerResource = footerResource;    }    /**     * 加载完成     */    private void loadMoreComplete() {        this.isLoadingMore = false;    }    /**     * 正在刷新     */    private void loading(){        this.isLoadingMore = true;//设置正在刷新    }    /**     * 加载更多数据回调     *     * @param listener     */    public void setOnLoadMoreListener(OnLoadMoreListener listener) {        this.loadMoreListener = listener;    }    public interface OnLoadMoreListener {        void loadMoreListener();//上拉刷新    }    /**     * 刷新数据     */    public void notifyData() {        if (getAdapter() != null) {            loadMoreComplete();            if(footerResource != -1 && loadMoreEnable){                //隐藏脚布局                footer_visible = false;            }            getAdapter().notifyDataSetChanged();        }    }    public class AutoLoadAdapter extends Adapter<ViewHolder> {        private Adapter dataAdapter;//数据adapter        private final int TYPE_FOOTER = Integer.MAX_VALUE;//底部布局        public AutoLoadAdapter(Adapter adapter) {            this.dataAdapter = adapter;        }        @Override        public int getItemViewType(int position) {            if (position == getItemCount() - 1 && loadMoreEnable && footerResource != -1 && footer_visible) {                return TYPE_FOOTER;            }            if (dataAdapter.getItemViewType(position) == TYPE_FOOTER) {                throw new RuntimeException("adapter中itemType不能为:" + Integer.MAX_VALUE);            }            return dataAdapter.getItemViewType(position);        }        @Override        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            ViewHolder holder = null;            if (viewType == TYPE_FOOTER) {//脚部                holder = new FooterViewHolder(LayoutInflater.from(getContext()).inflate(footerResource, parent, false));            } else {//数据                holder = dataAdapter.onCreateViewHolder(parent, viewType);            }            return holder;        }        @Override        public void onBindViewHolder(ViewHolder holder, int position) {            int itemViewType = getItemViewType(position);            if (itemViewType != TYPE_FOOTER) {                dataAdapter.onBindViewHolder(holder, position);            }        }        @Override        public int getItemCount() {            if (dataAdapter.getItemCount() != 0) {                int count = dataAdapter.getItemCount();                if (loadMoreEnable && footerResource != -1 && footer_visible) {                    count++;                }                return count;            }            return 0;        }        public class FooterViewHolder extends ViewHolder {            public FooterViewHolder(View itemView) {                super(itemView);            }        }    }}

activity中:

        mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_red_light, android.R.color.ho        lo_blue_light, android.R.color.holo_green_light);        recyclerView.setLoadMoreEnable(true);//允许加载更多        recyclerView.setFooterResource(R.layout.item_footer);//设置脚布局        recyclerView.setOnLoadMoreListener(new RefreshRecyclerView.OnLoadMoreListener() {            @Override            public void loadMoreListener() {                handler.postDelayed(new Runnable() {                    @Override                    public void run() {                        for (int i = 0; i < 10; i++) {                            statisticsResponseModel = new StatisticsResponseModel();                            statisticsResponseModel.setName("OK" + i);                            mList.add(statisticsResponseModel);                        }                        mRefreshAdapter.setmList(mList);                        recyclerView.notifyData();//刷新数据                    }                }, 5000);            }        });//分页        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {            @Override            public void onRefresh() {                handler.postDelayed(new Runnable() {                    @Override                    public void run() {                        mSwipeRefreshLayout.setRefreshing(false);                        recyclerView.notifyData();//刷新数据                    }                }, 2000);            }        });    }//下拉刷新

gradle文件添加:

 compile 'jp.wasabeef:recyclerview-animators:1.3.0'

有问题联系:1808418098(微信、QQ)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表