[後端 Controller] → JSON 字符串 → [Android OkHttp/Retrofit] → Gson 解析 → List → ArrayAdapter → ListView
// Spring Boot
@GetMapping("/api/items")
public List- getItems() {
return itemService.findAll(); // Jackson 自動序列化為 JSON 數組
}
// 輸出:[{"id":1,"name":"Item1"},{"id":2,"name":"Item2"}]
public class Item {
private int id;
private String name;
// getter/setter
}
// 使用 OkHttp
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-server.com/api/items")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
runOnUiThread(() -> Toast.makeText(MainActivity.this, "網絡錯誤", Toast.LENGTH_SHORT).show());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) return;
String json = response.body().string();
// Gson 解析數組
Type listType = new TypeToken>(){}.getType();
List- items = new Gson().fromJson(json, listType);
// 切換到主線程更新 UI
runOnUiThread(() -> {
ArrayAdapter
- adapter = new ArrayAdapter<>(
MainActivity.this,
android.R.layout.simple_list_item_1,
items
);
listView.setAdapter(adapter);
});
}
});
public interface ApiService {
@GET("api/items")
Call> getItems();
}
// 調用
api.getItems().enqueue(new Callback>() {
@Override public void onResponse(Call> call, Response> resp) {
if (resp.isSuccessful() && resp.body() != null) {
adapter = new ArrayAdapter<>(MainActivity.this,
android.R.layout.simple_list_item_1, resp.body());
listView.setAdapter(adapter);
}
}
@Override public void onFailure(Call> call, Throwable t) { /* 錯誤處理 */ }
});
new TypeToken>(){}.getType()
。runOnUiThread。ArrayAdapter 自動調用 toString() 顯示,或自定義 Adapter 複雜佈局。GET /api/items?page=1&size=20,滾動到底部加載下一頁,adapter.notifyItemRangeInserted()。Glide/Picasso 異步載入列表圖片。標準化「HTTP JSON → Gson → List