Android Java中如何将硬编码ItemModel列表改为从JSON接口获取或循环添加?
实现方案
方案1:本地循环批量添加(适用于测试数据场景)
你可以先把所有待添加的数据统一存到一个数据源集合中,再通过循环遍历批量调用add方法,避免重复硬编码:
// 先把所有ItemModel需要的参数按顺序存入二维数组 String[][] testData = { {"10.30", "120/10", "80", "Tue,31 Oct 17"}, {"10.30", "142/95", "95", "Tue,31 Oct 17"}, {"15.30", "120/95", "200", "Tue,31 Oct 17"}, {"20.30", "120/10", "80", "Tue,29 Oct 17"}, {"10.30", "120/10", "50", "Tue,29 Oct 17"}, {"10.30", "140/10", "80", "Tue,28 Oct 17"}, {"10.30", "30/75", "40", "Tue,28 Oct 17"}, {"10.30", "150/80", "70", "Tue,28 Oct 17"} }; ArrayList<ItemModel> items = new ArrayList<>(); // 循环遍历批量添加 for (String[] item : testData) { items.add(new ItemModel(item[0], item[1], item[2], item[3])); } return items;
方案2:从JSON数据源拉取解析生成列表(适用于正式业务场景)
前置准备
- 先在模块级
build.gradle中添加网络请求和JSON解析依赖:
dependencies { // 网络请求库 implementation 'com.squareup.okhttp3:okhttp:4.10.0' // JSON解析库 implementation 'com.google.code.gson:gson:2.10.1' }
- 在
AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
核心实现逻辑
安卓禁止在主线程执行网络请求,你可以用协程、AsyncTask或者OkHttp的异步回调来实现,下面是异步请求示例:
public void loadItemData(OnDataLoadedListener listener) { ArrayList<ItemModel> items = new ArrayList<>(); String jsonUrl = "你的JSON数据源地址"; OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(jsonUrl) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { // 处理请求失败逻辑 listener.onFailed(e.getMessage()); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { if (response.isSuccessful() && response.body() != null) { String jsonStr = response.body().string(); // 解析JSON数组,这里需要根据你实际的JSON结构调整解析逻辑 // 示例假设JSON返回的是数组,每个元素的字段对应ItemModel的四个入参 JsonArray jsonArray = JsonParser.parseString(jsonStr).getAsJsonArray(); for (JsonElement element : jsonArray) { JsonObject obj = element.getAsJsonObject(); // 替换下面的字段名为你实际JSON返回的字段名 String time = obj.get("time").getAsString(); String rate = obj.get("rate").getAsString(); String value = obj.get("value").getAsString(); String date = obj.get("date").getAsString(); items.add(new ItemModel(time, rate, value, date)); } // 切回主线程回调结果 new Handler(Looper.getMainLooper()).post(() -> listener.onSuccess(items)); } } }); } // 自定义回调接口 public interface OnDataLoadedListener { void onSuccess(ArrayList<ItemModel> items); void onFailed(String errorMsg); }
你在需要加载数据的地方调用loadItemData方法,在onSuccess回调中拿到最终的列表即可使用。
内容的提问来源于stack exchange,提问作者JuniorCode
相关产品推荐
相关产品推荐

