搭配SwipeRefreshLayout的Recyclerview刷新

学习目标
  1. 了解 SwipeRefreshLayout 控件
  2. 使用 SwipeRefreshLayout 实现 Recyclerview 下拉刷新
  3. 给 apdater 添加加载更多的 item 实现 Recyclerview 上拉加载更多功能

SwipeRefreshLayout简介

SwipeRefreshLayout 是谷歌推出的专门用于下拉刷新的控件。根据 API 的介绍,它应该被用在使用者想通过垂直的滑动手势来刷新一个 view 的内容,在 Activity 中实例化这个控件,同时加上 OnRefreshListener 来通知刷新手势完成。通过调用 setRefreshing(boolean x) 方法,设置 flase 来取消刷新指示;设置 true显示刷新进度动画。如果想让下拉手势的刷新进度动画实效,可以调用 setEnabled(false) 方法。

SwipeRefreshLayout 作为 view 的父控件,仅支持作用于直接的子 view,子 view 的宽高和 SwipeRefreshLayout 控件的宽高相匹配。

应用实例

效果图

布局文件,SwipeRefreshLayout 嵌套 RecyclerView

 <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swip_refresh_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </android.support.v4.widget.SwipeRefreshLayout>

下拉刷新代码

// 设置进度小圆圈下拉刷新时的缩放效果,以及开始、结束的位置
mSwipeRefreshLayout.setProgressViewOffset(true,0,100);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                list.clear();
                list.addAll(getData());
                mAdapter.notifyDataSetChanged();
                mSwipeRefreshLayout.setRefreshing(false);
            }
        });

关于上拉加载更多,先在 adapter 中添加加载更多的 item 样式

private static final int VIEW_TYPE_ITEM = 0;
    private static final int VIEW_TYPE_FOOTER = 1;

    private LayoutInflater mLayoutInflater;
    private List mList;

    public DataAdapter(Context context,List list) {
        mLayoutInflater = LayoutInflater.from(context);
        mList = list;
    }

    @Override
    public DataAdapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_ITEM) {
            return new MyHolder(mLayoutInflater.inflate(R.layout.item_layout,parent,false));
        } else if (viewType == VIEW_TYPE_FOOTER) {
            return new MyHolder(mLayoutInflater.inflate(R.layout.item_more,parent,false));
        }
        return null;
    }

    @Override
    public void onBindViewHolder(DataAdapter.MyHolder holder, int position) {
        if ( mList.size() != 0 && position < mList.size()) {
            holder.textView.setText("position: "+position);
        }
    }

    @Override
    public int getItemCount() {
        return mList.size() +1;
    }

    @Override
    public int getItemViewType(int position) {

        if (position == mList.size()) {
            return VIEW_TYPE_FOOTER;
        }
        return VIEW_TYPE_ITEM;
    }

    class MyHolder extends RecyclerView.ViewHolder {

        private TextView textView;

        public MyHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.title);
        }
    }

在 Activity 中对 Recyclerview 设置滑动监听

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            boolean isSlidingToLast = false;

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                isSlidingToLast = dy > 0;
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                // 不滚动时
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {

                    // 获取最后一个显示的 item position
                    int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
                    int totalItemCount = mLayoutManager.getItemCount();

                    // 判断是否滚动到底部
                    if (lastVisibleItem == (totalItemCount -1) ) {
                        List newDatas = getData();
                        if (newDatas != null) {
                            list.addAll(newDatas);
                            mAdapter.notifyDataSetChanged();
                        }
                    }
                }
            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值