類微博客戶端介面:頂部按鈕列、中間可滾動 ListView、底部輸入列。ListView 高度自適應佔據剩餘空間,資料來自網路 JSON 陣列。
<LinearLayout android:orientation="vertical" ...>
<RelativeLayout android:id="@+id/top_bar" ... /> <!-- 固定高度 -->
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" /> <!-- 關鍵:weight=1 佔滿剩餘 -->
<LinearLayout android:id="@+id/bottom_bar" ... /> <!-- 固定高度 -->
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private ListView listView;
private SimpleAdapter adapter;
private List<Map<String, String>> dataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.list_view);
// 模擬網路請求,實際用 OkHttp/Retrofit + Gson
new Thread(() -> {
String json = fetchJsonFromNetwork(); // 返回含 username 陣列的 JSON
parseAndFill(json);
runOnUiThread(() -> adapter.notifyDataSetChanged());
}).start();
adapter = new SimpleAdapter(this, dataList, R.layout.list_item,
new String[]{"username"}, new int[]{R.id.tv_name});
listView.setAdapter(adapter);
}
private void parseAndFill(String json) {
try {
JSONObject obj = new JSONObject(json);
JSONArray users = obj.getJSONArray("onlineuser");
for (int i = 0; i < users.length(); i++) {
Map<String, String> item = new HashMap<>();
item.put("username", users.getJSONObject(i).getString("username"));
dataList.add(item);
}
} catch (JSONException e) { e.printStackTrace(); }
}
}
roomid、theme、host、onlineuser 皆為 static 但未賦值,直接 setText 會崩潰或顯示 null。while 迴圈每次迭代都 new SimpleAdapter 並 setAdapter,極度低效且導致閃爍。應在迴圈外建立一次,迴圈內只 dataList.add(),最後 notifyDataSetChanged()。ListActivity 卻 setContentView(R.layout.room),需改用 AppCompatActivity 並手動 findViewById。RecyclerView 替代 ListView,支援 ViewHolder、動畫、分頁加載。ViewBinding 或 DataBinding 減少 findViewById 樣板碼。Retrofit + Coroutine/Flow,避免手動執行緒管理。