使用SwipeToLoadLayout解决RecyclerView的上拉下拉刷新

SwipeToLoadLayout是一个非常好用的开源控件,可以支持本身能够滑动的控件,比如ListView、ScrollView、RecyclerView、GridView,还可以支持其他WebView,Linearlayout,RelativeLayout,FrameLayout,ImageView,TextView等不能滑动的控件的刷新和加载。
网上关于SwipeToLoadLayout的使用资料有很多,自己也去研究了下源码,简单的总结下使用方法和可能遇到的坑。

源码地址https://github.com/Aspsine/SwipeToLoadLayout

核心代码是项目中的一个library
这里写图片描述

其中这里有一个坑,就是相关的控件id的名字不能随意修改,第一次使用SwipeToLoadLayout控件的小伙伴可能会比较懵逼
这里写图片描述

因为在源代码SwipeToLoadLayout中,原作者把上拉头和下拉头以及目标控件的id都写死了,所以如果随意更改id,会导致控件找不到
这里写图片描述

为了方便使用,我将这段代码注释了,觉得不能改id有点怪怪的,并增加set方法

 public void setHeaderView(View headerView) {
        mHeaderView = headerView;
    }

    public void setTargetView(View targetView) {
        mTargetView = targetView;
    }

    public void setFooterView(View footerView) {
        mFooterView = footerView;
    }

这样,就可以自己设置目标和上拉下拉头,id的名字就可以随意改动了

下面贴上我在源代码基础上改动后的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="demo.recyclerview.swipetoloadlayout.com.swipetoloadlayoutrecylerviewdemo.MainActivity">


    <com.aspsine.swipetoloadlayout.SwipeToLoadLayout
        android:id="@+id/swipeToLoadLayout"
        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:clipToPadding="false" />

    </com.aspsine.swipetoloadlayout.SwipeToLoadLayout>

</LinearLayout>
public class MainActivity extends AppCompatActivity implements OnRefreshListener, OnLoadMoreListener {

    @BindView(R.id.swipeToLoadLayout)
    SwipeToLoadLayout mSwipeToLoadLayout;
    @BindView(R.id.recycler_view)
    RecyclerView mRecyclerView;


    private List<String> mList = new ArrayList<>();

    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*不会用ButterKnife的小伙伴可以直接用findViewById()来找控件*/
        ButterKnife.bind(this);


        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        MyAdapter mAdapter = new MyAdapter(this, mList);
        mRecyclerView.setAdapter(mAdapter);

        mSwipeToLoadLayout.setTargetView(mRecyclerView);

        /*如果使用setRefreshHeaderView和setLoadMoreFooterView方法,则不需要在xml中写入R.layout.layout_twitter_header,R.layout.layout_classic_footer*/
        mSwipeToLoadLayout.setRefreshHeaderView(LayoutInflater.from(this).inflate(R.layout.layout_twitter_header, mSwipeToLoadLayout, false));
        mSwipeToLoadLayout.setLoadMoreFooterView(LayoutInflater.from(this).inflate(R.layout.layout_classic_footer, mSwipeToLoadLayout, false));

        mSwipeToLoadLayout.setOnRefreshListener(this);
        mSwipeToLoadLayout.setOnLoadMoreListener(this);

        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    if (!ViewCompat.canScrollVertically(recyclerView, 1)) {
                        mSwipeToLoadLayout.setLoadingMore(true);
                    }
                }
            }
        });
    }

    @Override
    public void onRefresh() {
        LogT.i("正在刷新:");
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mSwipeToLoadLayout.setRefreshing(false);
            }
        }, 2000);
    }

    @Override
    public void onLoadMore() {
        LogT.i("加载更多数据:");
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mSwipeToLoadLayout.setLoadingMore(false);
            }
        }, 2000);
    }
}

这里写图片描述

自己做的小demo的地址https://github.com/linqinen708/RecyclerViewSwipeToLoadLayout

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值