Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách chọn item Spinner theo giá trị (value) thay vì vị trí (position) trong Android

Giới thiệu

Bài viết này hướng dẫn cách set selection cho Spinner dựa trên giá trị (value/text) của item thay vì vị trí (position/index). Cách này linh hoạt hơn khi dữ liệu thay đổi thứ tự.

Các bước thực hiện

Bước 1: Tạo dự án mới

Khởi tạo project Android Studio mới.

Bước 2: Layout (res/layout/activity_main.xml)

<?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"
    android:padding="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnSelectRonaldo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:onClick="selectSpinnerByValue"
        android:text="Chọn Cristiano Ronaldo" />

    <Spinner
        android:id="@+id/spinnerPlayers"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/btnSelectRonaldo"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="Chọn Spinner item bằng giá trị (Value) thay vì Position"
        android:textAlignment="center"
        android:textSize="18sp"
        android:textStyle="bold|italic" />

</RelativeLayout>

Bước 3: Code Java (src/MainActivity.java)

package app.com.sample;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    Spinner spinner;
    String[] footballPlayers = {
        "Lionel Messi", "Eden Hazard", "Cristiano Ronaldo",
        "Neymar Jr", "Gareth Bale", "David Beckham"
    };

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

        spinner = findViewById(R.id.spinnerPlayers);

        // Setup adapter
        List<String> playersList = new ArrayList<>(Arrays.asList(footballPlayers));
        ArrayAdapter<String> adapter = new ArrayAdapter<>(
            this,
            android.R.layout.simple_spinner_dropdown_item,
            playersList
        );
        // Custom dropdown layout (optional)
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    }

    // Gọi khi nhấn button
    public void selectSpinnerByValue(View view) {
        String targetValue = "Cristiano Ronaldo";
        setSpinnerSelectionByValue(spinner, targetValue);
    }

    /**
     * Set Spinner selection theo giá trị text của item
     * @param spinner Spinner target
     * @param value Giá trị cần chọn (text hiển thị)
     * @return true nếu tìm thấy và set thành công
     */
    public boolean setSpinnerSelectionByValue(Spinner spinner, String value) {
        if (spinner == null || value == null) return false;

        ArrayAdapter adapter = (ArrayAdapter) spinner.getAdapter();
        if (adapter == null) return false;

        // Duyệt qua tất cả item trong adapter
        for (int i = 0; i < adapter.getCount(); i++) {
            Object item = adapter.getItem(i);
            if (item != null && value.equals(item.toString())) {
                spinner.setSelection(i);
                return true;
            }
        }
        return false; // Không tìm thấy giá trị
    }

    // Overload cho object tùy chỉnh (cần override toString() trong model)
    public <T> boolean setSpinnerSelectionByValue(Spinner spinner, T value) {
        if (spinner == null || value == null) return false;
        ArrayAdapter<T> adapter = (ArrayAdapter<T>) spinner.getAdapter();
        if (adapter == null) return false;

        for (int i = 0; i < adapter.getCount(); i++) {
            if (value.equals(adapter.getItem(i))) {
                spinner.setSelection(i);
                return true;
            }
        }
        return false;
    }
}

Bước 4: Custom spinner dropdown item (res/layout/spinner_item.xml) - Tùy chọn

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="12dp"
    android:textSize="16sp"
    android:textColor="#333333"
    android:background="?android:attr/selectableItemBackground" />

Sử dụng: adapter.setDropDownViewResource(R.layout.spinner_item);

Bước 5: Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Chạy ứng dụng

Chạy app, Spinner hiển thị danh sách cầu thủ. Nhấn nút "Chọn Cristiano Ronaldo" → Spinner tự động chọn item "Cristiano Ronaldo" bất kể nó ở vị trí nào.

Cách chọn item Spinner theo giá trị (value) thay vì vị trí (position) trong Android

Mở rộng: Spinner với Object phức tạp (Custom Model)

// Model
data class Player(val id: Int, val name: String, val country: String) {
    override fun toString(): String = name // Hiển thị trong spinner
}

// Adapter
ArrayAdapter<Player> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, playerList);

// Chọn theo object
Player target = new Player(7, "Cristiano Ronaldo", "Portugal");
setSpinnerSelectionByValue(spinner, target); // Sử dụng equals() của Player

// Hoặc chọn theo ID
public void setSpinnerById(Spinner spinner, int targetId) {
    ArrayAdapter<Player> adapter = (ArrayAdapter<Player>) spinner.getAdapter();
    for (int i = 0; i < adapter.getCount(); i++) {
        if (adapter.getItem(i).getId() == targetId) {
            spinner.setSelection(i);
            break;
        }
    }
}

Lưu ý

  • Phương pháp này O(n) - duyệt tuyến tính. Với list lớn (>1000 items), cân nhắc dùng HashMap<String, Integer> map value→position
  • So sánh chuỗi: dùng equals() không phải ==
  • Case-sensitive: "ronaldo" ≠ "Ronaldo". Dùng equalsIgnoreCase() nếu cần
  • Spinner phải đã setAdapter trước khi gọi method này