Spinner में पोजिशन के बजाय मान (वैल्यू) के आधार पर चयन सेट करना
डिफ़ॉल्ट रूप से spinner.setSelection(position) इंडेक्स का उपयोग करता है। लेकिन अक्सर हमें किसी विशिष्ट मान (जैसे "क्रिस्टियानो रोनाल्डो") के आधार पर चयन सेट करना होता है। यह उदाहरण मान-आधारित चयन के तरीके दिखाता है।
चरण 1: नया प्रोजेक्ट बनाएं
Android Studio में प्रोजेक्ट बनाएं।
चरण 2: लेआउट फ़ाइल
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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="फुटबॉल खिलाड़ी चुनें:"
android:textSize="18sp"
android:textStyle="bold" />
<Spinner
android:id="@+id/spinnerPlayers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/textView" />
<Button
android:id="@+id/btnSelectByValue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/spinnerPlayers"
android:layout_marginTop="16dp"
android:onClick="selectByValue"
android:text="मान द्वारा चुनें: क्रिस्टियानो रोनाल्डो" />
<Button
android:id="@+id/btnSelectByIndex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/btnSelectByValue"
android:layout_marginTop="8dp"
android:onClick="selectByIndex"
android:text="इंडेक्स द्वारा चुनें: 0 (मेस्सी)" />
<TextView
android:id="@+id/tvSelected"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/btnSelectByIndex"
android:layout_marginTop="16dp"
android:gravity="center"
android:textSize="16sp"
android:textStyle="bold" />
</RelativeLayout>
चरण 3: MainActivity में स्पिनर सेटअप और चयन लॉजिक
package com.app.sample;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Spinner spinnerPlayers;
private TextView tvSelected;
private List playersList;
private ArrayAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinnerPlayers = findViewById(R.id.spinnerPlayers);
tvSelected = findViewById(R.id.tvSelected);
// डेटा स्रोत
String[] playersArray = {
"लियोनेल मेस्सी", "ईडन हैज़र्ड", "क्रिस्टियानो रोनाल्डो",
"नेमार जूनियर", "गैरेथ बेल", "डेविड बेकहम"
};
playersList = new ArrayList<>(Arrays.asList(playersArray));
// एडाप्टर बनाएं
adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, playersList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerPlayers.setAdapter(adapter);
// चयन परिवर्तन लिस्टनर
spinnerPlayers.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
String selected = playersList.get(position);
tvSelected.setText("चयनित: " + selected + " (इंडेक्स: " + position + ")");
}
@Override
public void onNothingSelected(AdapterView> parent) {
tvSelected.setText("कोई चयन नहीं");
}
});
}
// विधि 1: मान द्वारा चयन सेट करें (मुख्य समाधान)
public void selectByValue(View view) {
String targetValue = "क्रिस्टियानो रोनाल्डो";
int position = findPositionByValue(targetValue);
if (position >= 0) {
spinnerPlayers.setSelection(position);
Toast.makeText(this, "चयनित: " + targetValue + " (पोजिशन " + position + ")", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "मान नहीं मिला: " + targetValue, Toast.LENGTH_SHORT).show();
}
}
// मान के आधार पर पोजिशन खोजने का हेल्पर मेथड
private int findPositionByValue(String value) {
for (int i = 0; i < playersList.size(); i++) {
if (playersList.get(i).equals(value)) {
return i;
}
}
return -1; // नहीं मिला
}
// विधि 2: इंडेक्स द्वारा (तुलना के लिए)
public void selectByIndex(View view) {
spinnerPlayers.setSelection(0); // मेस्सी
}
// एडवांस्ड: केस-इनसेंसिटिव खोज
private int findPositionByValueIgnoreCase(String value) {
for (int i = 0; i < playersList.size(); i++) {
if (playersList.get(i).equalsIgnoreCase(value)) {
return i;
}
}
return -1;
}
// एडवांस्ड: ऑब्जेक्ट लिस्ट के लिए (ID + नाम)
private void setupObjectSpinner() {
List playerObjects = Arrays.asList(
new Player(1, "मेस्सी"),
new Player(7, "रोनाल्डो"),
new Player(10, "नेमार")
);
// कस्टम एडाप्टर या toString() ओवरराइड करें
ArrayAdapter objectAdapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, playerObjects);
// Player क्लास में toString() { return name; } होना चाहिए
// ID द्वारा चयन
int targetId = 7;
for (int i = 0; i < objectAdapter.getCount(); i++) {
if (objectAdapter.getItem(i).getId() == targetId) {
spinnerPlayers.setSelection(i);
break;
}
}
}
// Player डेटा क्लास
static class Player {
int id;
String name;
Player(int id, String name) { this.id = id; this.name = name; }
int getId() { return id; }
String getName() { return name; }
@Override public String toString() { return name; }
}
}
कस्टम एडाप्टर के साथ ऑब्जेक्ट-आधारित चयन
// कस्टम एडाप्टर जिसमें getItemId() ओवरराइड हो public class PlayerAdapter extends ArrayAdapter{ public PlayerAdapter(Context context, List players) { super(context, 0, players); } @Override public long getItemId(int position) { return getItem(position).getId(); // ID को आइटम ID के रूप में उपयोग } } // फिर ID द्वारा चयन: long targetId = 7; for (int i = 0; i < adapter.getCount(); i++) { if (adapter.getItemId(i) == targetId) { spinner.setSelection(i); break; } }
चरण 4: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.app.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Kotlin एक्सटेंशन फंक्शन
// Spinner एक्सटेंशन funSpinner.setSelectionByValue(value: T): Boolean { val adapter = this.adapter if (adapter == null) return false for (i in 0 until adapter.count) { if (adapter.getItem(i).equals(value)) { setSelection(i) return true } } return false } // उपयोग spinnerPlayers.setSelectionByValue("क्रिस्टियानो रोनाल्डो")
सारांश: चयन विधियाँ
| विधि | उपयोग | रिटर्न |
|---|---|---|
setSelection(int position) | इंडेक्स द्वारा चयन | void |
setSelection(int position, boolean animate) | एनिमेशन के साथ इंडेक्स द्वारा | void |
| कस्टम लूप + setSelection | मान/ऑब्जेक्ट प्रॉपर्टी द्वारा | boolean (मिला/नहीं) |
नोट: Spinner का एडाप्टर सेट होने के बाद ही setSelection() कॉल करें। यदि एडाप्टर बाद में बदलता है (notifyDataSetChanged), चयन रीसेट हो सकता है - आवश्यकतानुसार पुन: लागू करें।