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

Android 動態新增 TextView 陣列到 LinearLayout:避免空指標與索引越界

     編輯:程式設計綜合問答

問題現象

動態建立 TextView[] 加入 LinearLayout,迴圈中直接對陣列元素呼叫 setText() 導致 NullPointerException(陣列未實例化元素)與索引錯誤(從 1 開始)。

錯誤程式碼

TextView[] pairs = new TextView[num_match + 1];
for (int l = 1; l <= num_match; l++) {
    pairs[l].setTextSize(15);  // NPE:pairs[l] 為 null
    pairs[l].setText(m1[l] + " - " + m2[l]);
    myLayout.addView(pairs[l]);
}

正確寫法

TextView[] pairs = new TextView[num_match];  // 長度 num_match,索引 0~num_match-1
for (int l = 0; l < num_match; l++) {
    pairs[l] = new TextView(this);  // 必須 new 實例
    pairs[l].setTextSize(15);
    pairs[l].setLayoutParams(lp);
    pairs[l].setId(l);
    pairs[l].setText(m1[l] + " - " + m2[l]);  // 資料陣列同步 0-based
    myLayout.addView(pairs[l]);
}

關鍵修正點

  1. new 實例:TextView[] 只配置參考陣列,每個元素必須 new TextView(context)。
  2. 0-based 索引:Java 陣列/列表慣例從 0 開始,迴圈 l < num_match。
  3. 資料陣列對齊:m1/m2 同樣 0-based,或迴圈內用 l 直接索引。
  4. LayoutParams 復用:同一 lp 可共用,但每個 View 仍需 setLayoutParams。

完整可執行範例

public class DynamicTextViewActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dynamic);

        LinearLayout container = findViewById(R.id.container);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        String[] items = {"Apple", "Banana", "Cherry", "Date"};
        TextView[] views = new TextView[items.length];

        for (int i = 0; i < items.length; i++) {
            views[i] = new TextView(this);
            views[i].setText(items[i]);
            views[i].setTextSize(18);
            views[i].setLayoutParams(lp);
            views[i].setPadding(16, 16, 16, 16);
            container.addView(views[i]);
        }
    }
}

現代替代方案:RecyclerView

動態列表建議使用 RecyclerView + Adapter,優勢:

  • ViewHolder 模式自動回收,記憶體效能佳。
  • 支援動畫、分隔線、分頁載入。
  • 資料與視圖解耦,維護性高。

掌握「陣列配置 ≠ 物件建立」與「0-based 索引」兩大鐵律,動態建立 View 才不會踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved