使用SwipeRefreshLayout和RecyclerView实现上滑和下拉刷新

来源:互联网 发布:怎么删掉淘宝购买记录 编辑:程序博客网 时间:2024/06/15 17:07
     实现上拉和下拉刷新效果可以使用SwipeRefreshLayout+RecyclerView实现。效果大致如下。


     1、布局
     主要是RecyclerView嵌套在SwipeRefreshLayout中。(PS:不要忘记在gradle中添加这两组件所需的库),代码大致如下

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/swipe_refresh_widget"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycle_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:paddingTop="@dimen/card_margin">

    </android.support.v7.widget.RecyclerView>

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



     2、实现下拉刷新
     在Activity 或者 Fragment中实现下拉刷新操作,主要是使该Activity 或 Fragment 实现SwipeRefreshLayout的OnRefreshListener接口,然后在onRefresh()方法中完成相关的加载操作。如:

public class NewsListFragment extends Fragment implementsSwipeRefreshLayout.OnRefreshListener {

    @Bind(R.id.recycle_view)
    RecyclerView mRecyclerView;
    @Bind(R.id.swipe_refresh_widget)
    SwipeRefreshLayout mSwipeRefreshWidget;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_newslist, null);
        ButterKnife.bind(this, view);

        mSwipeRefreshWidget.setColorSchemeResources(R.color.primary,
                R.color.primary_dark, R.color.primary_light,
                R.color.accent);
        mSwipeRefreshWidget.setOnRefreshListener(this);//设置SwipeRefreshWidget下拉事件监听

        return view;
    }



    /**
    * 实现SwipeRefreshLayout.OnRefreshListener接口需要完成的方法
    * 下拉刷新数据
    */
    @Override
    public void onRefresh() {
        Log.i("TAG", "调用了onRefresh函数");
        //加载数据操作
        mNewsPresenter.onLoadNews(mType, pageIndex);
    }
}



     3、实现上拉刷新
     下拉刷新的操作主要是交个RecyclerView来完成。首先,创建一个RecyclerView滑动监听器RecyclerView.OnScrollListener;然后书写滑动监听器中需要完成的方法。实现下拉刷新的主要思路是利用滑动监听器来判断是不是滑到RecyclerView的最后一个Item。如果是最后一个Item同时也停止滑动了那么就运行加载操作。代码如下


public class NewsListFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

    @Bind(R.id.recycle_view)
    RecyclerView mRecyclerView;
    @Bind(R.id.swipe_refresh_widget)
    SwipeRefreshLayout mSwipeRefreshWidget;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_newslist, null);
        ButterKnife.bind(this, view);

        mSwipeRefreshWidget.setColorSchemeResources(R.color.primary,
                R.color.primary_dark, R.color.primary_light,
                R.color.accent);
        mSwipeRefreshWidget.setOnRefreshListener(this);//设置SwipeRefreshWidget下拉事件监听

        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(mLayoutManager);
        //设置动画
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

        //设置适配器
        mAdapter = new NewsAdapter(getActivity().getApplicationContext());
       
        mRecyclerView.setAdapter(mAdapter);
               //设置滑动事件监听器()
       mRecyclerView.addOnScrollListener(mOnScrollListener);

        onRefresh();

        return view;
    }

    /**
    * 实现SwipeRefreshLayout.OnRefreshListener接口需要完成的方法
    * 下拉刷新数据
    */
    @Override
    public void onRefresh() {
        Log.i("TAG", "调用了onRefresh函数");
        //加载数据
        mNewsPresenter.onLoadNews(mType, pageIndex);
    }


/**
* RecyclerView滑动监听器
*/
private RecyclerView.OnScrollListenermOnScrollListener = new RecyclerView.OnScrollListener() {

  private int lastVisibleItem;

  @Override
  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
  super.onScrolled(recyclerView, dx, dy);
 lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
  }

  @Override
  public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
  super.onScrollStateChanged(recyclerView, newState);
 //当滑动到最后一个且停止滚动时则网络加载数据
  if (newState == RecyclerView.SCROLL_STATE_IDLE
  && lastVisibleItem + 1 == mAdapter.getItemCount()) {
  //加载更多
  LogUtils.d(TAG, "loading more data");
  mNewsPresenter.onLoadNews(mType, pageIndex + Urls.PAZE_SIZE);
   }
  }
};
}

0 0