实现Android SmartRefreshLayout+Retrofit分页
一、整体流程
步骤 |
描述 |
1 |
在布局文件中添加SmartRefreshLayout控件和RecyclerView控件 |
2 |
创建数据模型类 |
3 |
创建Retrofit接口 |
4 |
创建Retrofit实例 |
5 |
在Activity/Fragment中初始化SmartRefreshLayout和RecyclerView |
6 |
发起网络请求获取数据 |
7 |
将数据绑定到RecyclerView适配器 |
8 |
添加上拉加载更多的逻辑 |
9 |
添加下拉刷新的逻辑 |
二、具体步骤
1. 在布局文件中添加SmartRefreshLayout控件和RecyclerView控件
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
2. 创建数据模型类
public class Item {
private String name;
// 其他属性...
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3. 创建Retrofit接口
public interface ApiService {
@GET("items")
Call<List<Item>> getItems(@Query("page") int page, @Query("pageSize") int pageSize);
}
4. 创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
5. 在Activity/Fragment中初始化SmartRefreshLayout和RecyclerView
SmartRefreshLayout refreshLayout = findViewById(R.id.refreshLayout);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// 创建适配器并设置给RecyclerView
ItemAdapter adapter = new ItemAdapter();
recyclerView.setAdapter(adapter);
6. 发起网络请求获取数据
int page = 1;
int pageSize = 10;
// 发起网络请求
Call<List<Item>> call = apiService.getItems(page, pageSize);
call.enqueue(new Callback<List<Item>>() {
@Override
public void onResponse(Call<List<Item>> call, Response<List<Item>> response) {
if (response.isSuccessful()) {
List<Item> items = response.body();
// 数据获取成功,更新适配器数据
adapter.setData(items);
} else {
// 数据获取失败
}
// 停止刷新
refreshLayout.finishRefresh();
}
@Override
public void onFailure(Call<List<Item>> call, Throwable t) {
// 网络请求失败
// 停止刷新
refreshLayout.finishRefresh();
}
});
7. 将数据绑定到RecyclerView适配器
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
private List<Item> itemList = new ArrayList<>();
// 其他方法...
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Item item = itemList.get(position);
holder.nameTextView.setText(item.getName());
// 其他视图绑定操作...
}
// 其他方法...
}
8. 添加上拉加载更多的逻辑
refreshLayout.setOnLoadMoreListener(refreshLayout -> {
int currentPage = adapter.getItemCount() / pageSize + 1;
apiService.getItems(currentPage, pageSize).enqueue(new Callback<List<Item>>() {
@Override
public void onResponse(Call<List<Item>> call, Response<List<Item>> response) {
if (response.isSuccessful()) {
List<Item> items = response.body();
if (items != null && items.size() > 0) {
// 数据加载成功,追加到适配器数据末尾
adapter.appendData(items);
// 通知刷新
adapter.notifyItemRangeInserted(adapter.getItemCount() - items.size(), items.size());
// 加载完成
refreshLayout.finishLoadMore();
} else {
// 数据已全部加载,显示没有更多数据提示
refreshLayout.finishLoadMoreWithNoMoreData();
}
} else {
// 数据加载失败
// 加载完成
refreshLayout.finishLoadMore();
}
}
@Override
public void onFailure(Call<List<Item>> call, Throwable t) {
// 网络请求失败
// 加载完成
refreshLayout.finishLoadMore();
}
});
});
9. 添加下拉刷新的