You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓开发新手求教:如何用SwipeRefreshLayout更新RecyclerView的JSON数据

解决SwipeRefreshLayout集成RecyclerView的下拉刷新问题

嘿,作为Android新手能走到RecyclerView展示JSON这一步已经很棒了!关于集成SwipeRefreshLayout的问题,我来一步步帮你搞定,顺便把过时的DefaultHttpClient替换成现在主流的方案——毕竟它早就被官方废弃啦。

第一步:修改布局文件

首先得确保布局里SwipeRefreshLayout是RecyclerView的父容器,这样下拉手势才能被正确捕获。你的activity_health.xml应该调整成这样:

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

第二步:初始化组件并设置刷新监听

回到你的onCreate方法,先完成SwipeRefreshLayout的初始化,再给它绑定刷新回调。另外建议把你原来获取JSON数据的逻辑封装成单独方法,这样页面初始化和下拉刷新都能复用:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_health);

    // 保留你原来的RecyclerView初始化代码
    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mAdapter = new YourCustomAdapter(); // 替换成你自己的Adapter类
    mRecyclerView.setAdapter(mAdapter);

    // 初始化SwipeRefreshLayout
    SwipeRefreshLayout swipeRefreshLayout = findViewById(R.id.swipe_refresh_layout);
    // 设置刷新转圈的颜色(可选,根据你的主题调整)
    swipeRefreshLayout.setColorSchemeResources(R.color.purple_500, R.color.purple_700);

    // 设置下拉刷新监听
    swipeRefreshLayout.setOnRefreshListener(() -> {
        // 下拉时触发,开始获取最新数据
        fetchLatestServerData(swipeRefreshLayout);
    });

    // 页面首次加载时先拉取一次数据
    fetchLatestServerData(swipeRefreshLayout);
}

第三步:封装数据获取逻辑(替换DefaultHttpClient)

DefaultHttpClient在API 22就被废弃了,现在推荐用OkHttp或者Volley,这里给你写个OkHttp的简单示例。先确保你在app/build.gradle里添加了依赖:

implementation 'com.squareup.okhttp3:okhttp:4.11.0'

然后实现fetchLatestServerData()方法:

private void fetchLatestServerData(SwipeRefreshLayout swipeRefreshLayout) {
    // 显示刷新状态(转圈动画)
    swipeRefreshLayout.setRefreshing(true);

    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url("你的服务器JSON接口地址") // 替换成实际接口
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
            // 请求失败,必须结束刷新状态
            runOnUiThread(() -> swipeRefreshLayout.setRefreshing(false));
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful() && response.body() != null) {
                String jsonContent = response.body().string();
                // 用你原来的JSON解析逻辑处理数据
                List<YourDataModel> newDataList = parseJsonToData(jsonContent);

                // 更新RecyclerView必须在主线程
                runOnUiThread(() -> {
                    mAdapter.updateData(newDataList); // 假设你的Adapter有updateData方法
                    mAdapter.notifyDataSetChanged();
                    // 数据更新完成,结束刷新
                    swipeRefreshLayout.setRefreshing(false);
                });
            } else {
                runOnUiThread(() -> swipeRefreshLayout.setRefreshing(false));
            }
        }
    });
}

// 替换成你自己的JSON解析实现
private List<YourDataModel> parseJsonToData(String jsonContent) {
    List<YourDataModel> dataList = new ArrayList<>();
    // 这里写你的Gson/原生JSON解析逻辑
    return dataList;
}

关键注意事项

  • 网络请求必须在子线程:OkHttp的enqueue已经帮我们处理了子线程,但更新UI一定要用runOnUiThread,否则会触发崩溃。
  • 必须结束刷新状态:不管请求成功还是失败,都要调用swipeRefreshLayout.setRefreshing(false),不然转圈动画会一直停不下来。
  • 添加网络权限:别忘了在AndroidManifest.xml里加这句:
<uses-permission android:name="android.permission.INTERNET"/>

为什么不用DefaultHttpClient?

它被废弃是因为存在安全漏洞和性能瓶颈,官方现在更推荐OkHttp或HttpURLConnection,上面的示例逻辑更清晰,也更符合现代Android开发的规范。

如果你用Gson解析JSON,记得补充依赖:

implementation 'com.google.code.gson:gson:2.10.1'

这样下拉RecyclerView时,就会触发刷新,获取最新服务器数据并更新列表啦!

内容的提问来源于stack exchange,提问作者AnandaLC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:21:14