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

วิธีเพิ่มรายการใน Spinner (Dropdown) บน Android

Spinner (Dropdown) ใน Android: เพิ่ม Item และจัดการ Event

Spinner = Dropdown Selector ใช้เลือก 1 รายการจากหลายรายการ

ขั้นตอนที่ 1: Layout XML

<Spinner
    android:id="@+id/spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:prompt="@string/app_name" />

ขั้นตอนที่ 2: MainActivity.java - Setup Data & Adapter

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Spinner spinner = findViewById(R.id.spinner);
        
        // Data Source
        List<String> items = Arrays.asList(
            "JAVA", "ANDROID", "C Language", "CPP Language", "Go Language", "AVN SYSTEMS"
        );
        
        // Adapter (ใช้ Built-in Layout)
        ArrayAdapter<String> adapter = new ArrayAdapter<>(
            this,
            android.R.layout.simple_spinner_item,      // Layout สำหรับ Selected View
            items
        );
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // Layout สำหรับ Dropdown List
        
        // Set Adapter
        spinner.setAdapter(adapter);
        
        // Item Selected Listener
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String selected = parent.getItemAtPosition(position).toString();
                Toast.makeText(MainActivity.this, "Selected: " + selected, Toast.LENGTH_SHORT).show();
            }
            
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // ไม่มี Item ถูกเลือก (หายาก)
            }
        });
    }
}

Built-in Spinner Layouts

Custom Spinner Item Layout

สร้าง res/layout/spinner_item.xml และ spinner_dropdown_item.xml แล้วส่งเข้า Adapter Constructor

ArrayAdapter<String> adapter = new ArrayAdapter<>(
    this, R.layout.spinner_item, items
);
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);

ตั้งค่า Default Selection

spinner.setSelection(2); // Select index 2 (0-based)
spinner.setSelection(adapter.getPosition("Android")); // Select by Value

Disable/Enable Spinner

spinner.setEnabled(false); // Gray out, not clickable
spinner.setEnabled(true);

Programmatic Add/Remove Items

// ArrayAdapter supports add/remove/clear (if not immutable list)
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, new ArrayList<>());
adapter.add("New Item");
adapter.remove("Old Item");
adapter.clear();
adapter.notifyDataSetChanged();

⚠️ Common Pitfalls

  • onItemSelected เรียกตอน Init: เรียกครั้งแรกตอน setAdapter → ใช้ Flag ข้ามครั้งแรก
  • Prompt ไม่แสดง: android:prompt ใช้กับ Dialog Mode เท่านั้น (android:spinnerMode="dialog")
  • Layout Width: wrap_content อาจตัดข้อความ → ใช้ match_parent หรือ fixed dp

Modern Alternative: Material Components

// build.gradle
implementation "com.google.android.material:material:1.11.0"

// Layout
<com.google.android.material.textfield.MaterialAutoCompleteTextView
    android:id="@+id/autoComplete"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

// Activity
String[] items = {"JAVA", "ANDROID", "KOTLIN"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.dropdown_item, items);
autoComplete.setAdapter(adapter);
// ใส่ Text ได้ + Dropdown เลือกได้ (Combo Box Style)

สรุป

Spinner เหมาะสำหรับ Single Selection จากรายการจำกัด ใช้ ArrayAdapter + simple_spinner_item/dropdown_item สำหรับ Basic Usage สำหรับ Complex UI ควรพิจารณา MaterialAutoCompleteTextView หรือ Custom Dropdown Dialog

LayoutUsage
simple_spinner_itemSelected Item View (Default: TextView)
simple_spinner_dropdown_itemDropdown List Item (Default: CheckedTextView)