यदि आप स्पिनर के "इटिम चयन" को निकालना चाहते हैं, भले ही स्पिनर में आइटम चुना गया हो/यदि आइटम चुना गया है और इसे फिर से क्लिक किया गया है। फिर, जो स्पिनर फैली इस कस्टम वर्ग का उपयोग यह मेरे लिए काम किया
तो इस तरह स्पिनरों के साथ अपनी गतिविधि को संपादित, मैं
static Spinner spinner1;
बदल
static NDSpinner spinner1;
और
variables.spinner1 = (Spinner) findViewById(R.id.spinner1);
को
से
variables.spinner1 = (NDSpinner) findViewById(R.id.spinner1);
इसके अलावा, मैं XML लेआउट जहां स्पिनर स्थित है बदल
<Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/place" />
को
<com.yourpackagename.NDSpinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/place" />
स्पिनर विस्तार वर्ग:
package com.yourpackagename;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.Spinner;
import android.widget.Toast;
import java.lang.reflect.Field;
/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value.
* ie This is extended "Customized class of Spinner" to get the "onItemSelected" event even if the item in the
* Spinner is already selected by the user*/
public class NDSpinner extends Spinner {
public NDSpinner(Context context)
{ super(context); }
public NDSpinner(Context context, AttributeSet attrs)
{ super(context, attrs); }
public NDSpinner(Context context, AttributeSet attrs, int defStyle)
{ super(context, attrs, defStyle); }
private void ignoreOldSelectionByReflection() {
try {
Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass();
Field reqField = c.getDeclaredField("mOldSelectedPosition");
reqField.setAccessible(true);
reqField.setInt(this, -1);
} catch (Exception e) {
Log.d("Exception Private", "ex", e);
// TODO: handle exception
}
}
@Override
public void setSelection(int position, boolean animate)
{
boolean sameSelected = position == getSelectedItemPosition();
ignoreOldSelectionByReflection();
super.setSelection(position, animate);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
@Override
public void setSelection(int position) {
ignoreOldSelectionByReflection();
super.setSelection(position);
}
}
स्रोत
2013-09-09 07:54:41
प्रतीक्षा, आप कैसे की _opposite_ वर्णित एक स्पिनर काम करता है। जब आप OnItemClickListener का उपयोग करते हैं और OnItemSlectedListener को _regardless_ कहा जाता है, तो उपयोगकर्ता ने पिछले चयन को फिर से चुना है या एक नई पसंद बनाई है ... – Sam
प्रतिक्रिया के लिए धन्यवाद, मैंने गलत वर्तनी की है। मैं इटैम सेलेक्टेड लिस्टेमर() पर उपयोग कर रहा हूं। मैंने अब अपना संदेश संपादित कर लिया है। – user1400716