Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีเพิ่มรายการใน ListView แบบไดนามิก (Dynamic) ใน Android

บทความนี้สาธิตวิธีเพิ่มข้อมูลเข้า ListView แบบไดนามิกในขณะที่แอปทำงาน โดยใช้ ArrayAdapter และ notifyDataSetChanged()

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → File → New Project

ขั้นตอนที่ 2: Layout หลัก (activity_main.xml)

ประกอบด้วย EditText, Button, และ ListView:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="26dp"
        android:ems="10"
        android:hint="Add elements to ListView" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/editText1"
        android:layout_centerHorizontal="true"
        android:text="Add Values to ListView" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/button1"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

ขั้นตอนที่ 3: เขียนโค้ด MainActivity.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class MainActivity extends Activity {
    ListView listView;
    Button addButton;
    EditText inputEditText;
    String[] initialItems = {"Android", "PHP", "Python"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.listView1);
        addButton = findViewById(R.id.button1);
        inputEditText = findViewById(R.id.editText1);

        // สร้าง ArrayList จากข้อมูลเริ่มต้น
        final List<String> itemsList = new ArrayList<>(Arrays.asList(initialItems));

        // สร้าง Adapter
        final ArrayAdapter<String> adapter = new ArrayAdapter<>(
                MainActivity.this,
                android.R.layout.simple_list_item_1,
                itemsList
        );

        listView.setAdapter(adapter);

        // จัดการคลิกปุ่มเพิ่ม
        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String newItem = inputEditText.getText().toString().trim();
                if (!newItem.isEmpty()) {
                    itemsList.add(newItem);        // เพิ่มข้อมูลใน List
                    adapter.notifyDataSetChanged(); // แจ้ง Adapter ให้ refresh
                    inputEditText.setText("");      // ล้างช่องกรอก
                }
            }
        });
    }
}

หลักการทำงานสำคัญ

  1. ArrayList - ใช้เก็บข้อมูลเพื่อให้เพิ่ม/ลบได้ (Array ธรรมดาไม่สามารถเปลี่ยนขนาดได้)
  2. ArrayAdapter - เชื่อมข้อมูลกับ ListView
  3. notifyDataSetChanged() - สำคัญที่สุด บอก Adapter ว่าข้อมูลเปลี่ยน ให้ redraw ListView

การลบรายการ (Bonus)

// ตัวอย่าง: ลบรายการเมื่อคลิกยาว
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        itemsList.remove(position);
        adapter.notifyDataSetChanged();
        return true;
    }
});

แนวทางปฏิบัติที่ดี (Best Practices)

  • ตรวจสอบข้อมูลว่างก่อนเพิ่ม (trim() และ isEmpty())
  • ล้างช่องกรอกหลังเพิ่มสำเร็จ
  • สำหรับข้อมูลเยอะ ควรใช้ RecyclerView + DiffUtil แทน เพื่อประสิทธิภาพดีกว่า
  • หากข้อมูลมาจาก Database/Network ใช้ LiveData + ViewModel (Architecture Components)