使用SwipeToLoadLayout解决RecyclerView的上拉下拉刷新
程序员文章站
2024-03-22 23:01:10
...
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
推荐阅读
-
使用SwipeToLoadLayout解决RecyclerView的上拉下拉刷新
-
一步步自定义下拉刷新上拉加载——自定义简单的刷新组件
-
3年以上勿进!最简单的Android自定义ListView下拉刷新与上拉加载,代码直接拿去用~
-
Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法
-
Android使用PullToRefresh实现上拉加载和下拉刷新效果的代码
-
Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法
-
Android程序开发之使用PullToRefresh实现下拉刷新和上拉加载
-
Android开发ListView中下拉刷新上拉加载及带列的横向滚动实现方法
-
Android App使用RecyclerView实现上拉和下拉刷新的方法
-
Android使用PullToRefresh实现上拉加载和下拉刷新效果的代码