Android RecyclerView实现下拉刷新和上拉加载更多
作者:kklxb 时间:2022-03-16 09:02:40
使用官方的刷新控件SwipeRefreshLayout来实现下拉刷新,当RecyclerView滑到底部实现下拉加载(进度条效果用RecyclerView加载一个布局实现)
需要完成控件的下拉监听和上拉监听,其中,下拉监听通过SwipRefreshLayout的setOnRefreshListener()方法监听,而上拉刷新,需要通过监听列表的滚动,当列表滚动到底部时触发事件,具体代码如下
主布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/refresh_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
private SwipeRefreshLayout refreshLayout;
private RecyclerView recyclerView;
private LinearLayoutManager layoutManager;
private RecyclerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh_layout);
recyclerView = (RecyclerView) findViewById(R.id.recycler_list);
layoutManager = new LinearLayoutManager(this);
refreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary);//设置刷新时进度条
颜色,最多四种
refreshLayout.setOnRefreshListener(this);
mAdapter = new RecyclerAdapter();//自定义的适配器
recyclerView.setAdapter(mAdapter);
recyclerView.setLayoutManager(layoutManager);
recyclerView.addOnScrollListener(new OnRecyclerScrollListener());
}
/**
* 用于下拉刷新
*/
@Override
public void onRefresh() {
}
/**
* 用于上拉加载更多
*/
public class OnRecyclerScrollListener extends RecyclerView.OnScrollListener {
int lastVisibleItem = 0;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (mAdapter != null && newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 ==
mAdapter.getItemCount()) {
//滚动到底部了,可以进行数据加载等操作
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem = layoutManager.findLastVisibleItemPosition();
}
}
}
下面是实现上拉时进度条转动的效果
item_list_footer.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_item_footer_load_more"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:gravity="center"
android:text="上拉加载更多"
/>
<ProgressBar
android:id="@+id/pb_item_footer_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:visibility="gone"/>
</RelativeLayout>
适配器
public class RecyclerAdapter extends RecyclerView.Adapter<ViewHolder> {
private static final int TYPE_CONTENT = 0;
private static final int TYPE_FOOTER = 1;
private ArrayList<DataBean> dataList;
private ProgressBar pbLoading;
private TextView tvLoadMore;
public RecyclerAdapter() {
dataList = new ArrayList<>();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_CONTENT) {
return new ContentViewHolder(LayoutInflater.from(parent.getContext()).inflate
(R.layout.item_list_content, parent, false));
} else if (viewType == TYPE_FOOTER) {//加载进度条的布局
return new FooterViewHolder(LayoutInflater.from(parent.getContext()).inflate
(R.layout.item_list_footer, parent, false));
}
return null;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int type = getItemViewType(position);
if (type == TYPE_CONTENT) {
DataBean bean = dataList.get(position);
((ContentViewHolder) holder).tvId.setText("" + bean.getId());
((ContentViewHolder) holder).tvName.setText(bean.getName());
} else if (type == TYPE_FOOTER) {
pbLoading = ((FooterViewHolder) holder).pbLoading;
tvLoadMore = ((FooterViewHolder) holder).tvLoadMore;
}
}
/**
* 获取数据集加上一个footer的数量
*/
@Override
public int getItemCount() {
return dataList.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position + 1 == getItemCount()) {
return TYPE_FOOTER;
} else {
return TYPE_CONTENT;
}
}
/**
* 获取数据集的大小
*/
public int getListSize() {
return dataList.size();
}
/**
* 内容的ViewHolder
*/
public static class ContentViewHolder extends ViewHolder {
private TextView tvId, tvName;
public ContentViewHolder(View itemView) {
super(itemView);
tvId = (TextView) itemView.findViewById(R.id.tv_item_id);
tvName = (TextView) itemView.findViewById(R.id.tv_item_name);
}
}
/**
* footer的ViewHolder
*/
public static class FooterViewHolder extends ViewHolder {
private TextView tvLoadMore;
private ProgressBar pbLoading;
public FooterViewHolder(View itemView) {
super(itemView);
tvLoadMore = (TextView) itemView.findViewById(R.id.tv_item_footer_load_more);
pbLoading = (ProgressBar) itemView.findViewById(R.id.pb_item_footer_loading);
}
}
/**
* 显示正在加载的进度条,滑动到底部时,调用该方法,上拉就显示进度条,隐藏"上拉加载更多"
*/
public void showLoading() {
if (pbLoading != null && tvLoadMore != null) {
pbLoading.setVisibility(View.VISIBLE);
tvLoadMore.setVisibility(View.GONE);
}
}
/**
* 显示上拉加载的文字,当数据加载完毕,调用该方法,隐藏进度条,显示“上拉加载更多”
*/
public void showLoadMore() {
if (pbLoading != null && tvLoadMore != null) {
pbLoading.setVisibility(View.GONE);
tvLoadMore.setVisibility(View.VISIBLE);
}
}
}
标签:RecyclerView,下拉刷新,上拉加载
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
详解基于spring多数据源动态调用及其事务处理
2023-06-23 14:37:25
![](https://img.aspxhome.com/file/2023/0/57530_0s.png)
Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)
2023-02-26 10:45:41
![](https://img.aspxhome.com/file/2023/6/114336_0s.gif)
C#设置软件开机自动运行的方法(修改注册表)
2022-08-27 21:05:46
Java 泛型总结(一):基本用法与类型擦除
2023-06-11 20:33:10
Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】
2023-03-17 11:09:11
![](https://img.aspxhome.com/file/2023/5/80855_0s.jpg)
android为ListView每个Item上面的按钮添加事件
2023-12-19 06:06:47
![](https://img.aspxhome.com/file/2023/7/111707_0s.png)
C#无法打开计算机“.”上的 IISADMIN 服务的解决方法
2023-02-04 21:46:54
![](https://img.aspxhome.com/file/2023/4/100084_0s.png)
java开源调度如何给xxljob加k8s执行器
2021-09-17 16:41:50
![](https://img.aspxhome.com/file/2023/9/62229_0s.png)
SpringBoot 多Profile使用与切换方式
2022-04-13 14:58:27
![](https://img.aspxhome.com/file/2023/1/78951_0s.png)
Android解析json数组对象的方法及Apply和数组的三个技巧
2023-04-11 11:52:56
Java并发之不可思议的死循环详解
2023-10-20 03:11:34
使用SharedPreferences在Android存储对象详细代码
2022-06-14 12:50:29
Android ListView用EditText实现搜索功能效果
2021-05-29 09:05:25
![](https://img.aspxhome.com/file/2023/3/96773_0s.gif)
Android基础控件RadioGroup使用方法详解
2022-08-05 17:43:31
![](https://img.aspxhome.com/file/2023/0/128990_0s.jpg)
Android Studio3.6设置Gradle Offline Mode的方法
2022-07-26 09:36:01
![](https://img.aspxhome.com/file/2023/0/111700_0s.png)
java整合SSM框架的图文教程
2023-03-11 01:06:30
![](https://img.aspxhome.com/file/2023/8/67168_0s.jpg)
Java File类的概述及常用方法使用详解
2023-11-28 13:06:28
![](https://img.aspxhome.com/file/2023/7/81977_0s.png)
SpringBoot Web依赖教程
2023-01-06 21:51:50
![](https://img.aspxhome.com/file/2023/8/81958_0s.jpg)
解答为什么 Java 线程没有Running状态
2021-08-25 13:10:33
![](https://img.aspxhome.com/file/2023/2/72372_0s.jpg)
SpringBoot找不到映射文件的处理方式
2023-10-15 07:40:11
![](https://img.aspxhome.com/file/2023/7/72527_0s.png)