2012-08-24 13 views
14

मैं स्पिनर जो डेटाबेस से भरता है:स्पिनर आइटम के लिए क्लिकक्लिस्टर पर सेट करें?

catSpinner = (Spinner) findViewById(R.id.spinner1); 
cursor = dataAdapter.getAllCategory(); 
startManagingCursor(cursor); 
String[] from = new String[] { DataAdapter.CATEGORY_COL_NAME }; 
int[] to = new int[] { android.R.id.text1 }; 
SimpleCursorAdapter catAdapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_spinner_dropdown_item, cursor, from,to, 0); 
catAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
catAdapter.notifyDataSetChanged(); 
catSpinner.setAdapter(catAdapter); 

और मैं जब मैं अंतिम आइटम (Add new category...) का चयन AlertDialog कॉल करना चाहते हैं।
नई श्रेणी जोड़ने के बाद मैं चाहता हूं कि "आइटम (Add new category...)" आखिरी बार था।
मैं यह कैसे कर सकता हूं?

उत्तर

49

आप OnItemClickListener को स्पिनर के लिए कॉल नहीं करना चाहिए। एक स्पिनर आइटम क्लिक घटनाओं का समर्थन नहीं करता है। इस विधि को कॉल करने से अपवाद बढ़ जाएगा। this देखें। आप इसके बजाय OnItemSelectedListener लागू कर सकते हैं।

संपादित करें:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() 
    { 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
     { 
      String selectedItem = parent.getItemAtPosition(position).toString(); 
      if(selectedItem.equals("Add new category")) 
      { 
       // do your stuff 
      } 
     } // to close the onItemSelected 
     public void onNothingSelected(AdapterView<?> parent) 
     { 

     }   
    }); 

जहाँ तक सूची का संबंध है, मुझे लगता है कि आप बेहतर अपने सभी आइटम जोड़ने के बाद, जिसमें कस्टम एडाप्टर के लिए जाना चाहिए के अंत में "नई श्रेणी जोड़ें" के रूप में जोड़ने, आप उस निरंतर (नई श्रेणी जोड़ें) को सरणी के अंत में जोड़ सकते हैं ताकि यह हमेशा के लिए आना चाहिए।

+0

मैं यह जानता हूँ। लेकिन मैं 'OnItemSlectedListener' में कैसे संभाल सकता हूं केवल एक आइटम का चयन किया? –

+1

जब आप कोई आइटम चुनते हैं, तो आपको वह आइटम मिल जाएगा जो आपने चुना था। उस चयनित आइटम की तुलना अपनी पूर्वनिर्धारित वस्तु के साथ करें क्योंकि यह स्थिर है। यदि चयनित आइटम वह पूर्वनिर्धारित आइटम है, तो अपना कार्य – Braj

+0

करें यह काम नहीं करता है। मुझे लगता है क्योंकि यह 'parent.getItemAtPosition (स्थिति) .toString();' वापसी की स्थिति और इसे स्ट्रिंग में परिवर्तित करें। –

5

स्पिनर के OnItemClickListener पर हुक। फिर जांचें कि चयनित आइटम "नई श्रेणी जोड़ें" है या नहीं।

यदि हां, तो नया आइटम जोड़ने के लिए संवाद दिखाएं।

नया आइटम जोड़ते समय

  1. अंतिम आइटम निकालें "नई श्रेणी जोड़ें"।
  2. दर्ज की गई नई श्रेणी जोड़ें।
  3. फिर आइटम को "नई श्रेणी जोड़ें" फिर से जोड़ें।

यह "नई श्रेणी जोड़ें" आइटम को अंतिम के रूप में बना देगा।

कोड नमूना:

लेआउट main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:weightSum="10" > 

<Spinner 
    android:id="@+id/cmbNames" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

लेआउट spinner_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/tvName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

गतिविधि वर्ग:

public class MainActivity extends Activity { 

private static final String NAME = "name"; 
private static final String ADD_NEW_ITEM = "Add New Item"; 

private SimpleAdapter adapter; 
private Spinner cmbNames; 
private List<HashMap<String, String>> lstNames; 
private int counter; 

private OnItemSelectedListener itemSelectedListener = new OnItemSelectedListener() { 

    @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
     HashMap<String, String> map = lstNames.get(arg2); 
     String name = map.get(NAME); 
     if (name.equalsIgnoreCase(ADD_NEW_ITEM)) { 
      lstNames.remove(map); 
      counter++; 
      addNewName(String.valueOf(counter)); 
      addNewName(ADD_NEW_ITEM); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 

    } 
}; 

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

    populateList(); 

    cmbNames = (Spinner) findViewById(R.id.cmbNames); 
    adapter = new SimpleAdapter(this, lstNames, R.layout.spinner_item, 
      new String[] { NAME }, new int[] { R.id.tvName }); 
    cmbNames.setAdapter(adapter); 
    cmbNames.setOnItemSelectedListener(itemSelectedListener); 
} 

private void populateList() { 
    lstNames = new ArrayList<HashMap<String, String>>(); 

    addNewName("abc"); 
    addNewName("pqr"); 
    addNewName("xyz"); 
    addNewName(ADD_NEW_ITEM); 
} 

private void addNewName(String name) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put(NAME, name); 
    lstNames.add(map); 
} 

} 
+1

मैंने नमूना कोड के साथ पोस्ट अपडेट किया है। कृपया जांचें। –

+0

एक onitemclicklistener को स्पिनर से जोड़ा नहीं जा सकता – SoroushA

संबंधित मुद्दे