安卓开发新手求教:如何用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
相关产品推荐
相关产品推荐

