实现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. 添加下拉刷新的