首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ListView 嵌入複雜佈局:中間滾動區塊 + JSON 動態填充完整實戰

     編輯:程式設計綜合問答

需求場景

類微博客戶端介面:頂部按鈕列、中間可滾動 ListView、底部輸入列。ListView 高度自適應佔據剩餘空間,資料來自網路 JSON 陣列。

佈局關鍵:LinearLayout + layout_weight

<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>

Activity 中 JSON 解析與適配器綁定

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(); }
    }
}

原代碼三大錯誤修正

  1. 變數未初始化:roomid、theme、host、onlineuser 皆為 static 但未賦值,直接 setText 會崩潰或顯示 null。
  2. 迴圈中重複 new Adapter:while 迴圈每次迭代都 new SimpleAdapter 並 setAdapter,極度低效且導致閃爍。應在迴圈外建立一次,迴圈內只 dataList.add(),最後 notifyDataSetChanged()。
  3. ListActivity 與自定義佈局衝突:繼承 ListActivity 卻 setContentView(R.layout.room),需改用 AppCompatActivity 並手動 findViewById。

進階建議

  • 使用 RecyclerView 替代 ListView,支援 ViewHolder、動畫、分頁加載。
  • 採用 ViewBinding 或 DataBinding 減少 findViewById 樣板碼。
  • 網路層統一用 Retrofit + Coroutine/Flow,避免手動執行緒管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved