2010-07-19 14 views
13

मैं एंड्रॉइड में गतिशील रूप से अपने स्पिनर को अपडेट करने का प्रयास कर रहा हूं लेकिन कुछ भी मैं कोशिश नहीं कर रहा हूं।एक स्पिनर गतिशील रूप से कैसे अपडेट करें?

यह निम्नलिखित कोड है जिसे मैं स्पिनर को अपडेट करने के लिए उपयोग कर रहा हूं।

typeList = dbAdapter.getList(); //array list with the values 

adapter.notifyDataSetChanged(); 
groupSpinner.postInvalidate(); 
groupSpinner.setAdapter(adapter); 

टाइपलिस्ट के मान सही हैं लेकिन उन्हें स्पिनर में अपडेट नहीं किया जा रहा है।

+0

मैं फाई इसे सिर्फ एक नया नया एडाप्टर बनाया है ... मुझे लगता है कि मुझे ऐसा करना नहीं था। – 2Real

+0

क्या आपके पास एडाप्टर का एक उदाहरण है। यदि आप अपने एडाप्टर को फिर से सूचित करते हैं तो सूचित करेंडेटासेट चेंज काम नहीं करता है। – user1154390

उत्तर

3

क्या कोई टाइपो या कुछ है? dbAdapter और adapter के बीच अंतर क्या है। यदि स्पिनर पहले ही एडाप्टर है, तो आपको इसे फिर से असाइन करने की आवश्यकता नहीं है। अधिक से अधिक, केवल आपको लगता है कि आपको एडाप्टर अपडेट करना है और notifyDataSetChanged विधि पर कॉल करना है।

typeList = adapter.getList(); //array list with the values 
// change the values, and then 
adapter.notifyDataSetChanged(); 
+0

dbAdapter डेटाबेस एडाप्टर का मेरा लिंक एक कस्टम एडाप्टर है जो मैंने बनाया है जो बेसएडाप्टर को बढ़ाता है और स्पिनर एडाप्टर लागू करता है। मैंने आपके द्वारा सुझाए गए प्रयासों की कोशिश की और यह काम नहीं किया। – 2Real

10

आप केवल setAdapter() कॉल करने के लिए एक बार की जरूरत है और आप adapter.notifyDataSetChanged() फोन डेटा अद्यतन करने के लिए।

+0

क्या मुझे एक नया नया एडाप्टर बनाने की ज़रूरत है क्योंकि यह काम नहीं कर रहा है? जब मैं स्पिनर पर क्लिक करता हूं, तो सूची में मान अपडेट नहीं होते हैं। – 2Real

+12

मुझे सूची में काम करने के लिए 'NotifyDataSetChanger()' मिला है, लेकिन मैंने इसे स्पिनरों में काम नहीं देखा है। मुझे लगता है कि कुछ आंतरिक अंतर है जिसके लिए आपको हर बार एक नया एडाप्टर बनाने की आवश्यकता होती है। –

18

असल में, आपको या तो एडाप्टर पर स्पष्ट/जोड़ना होगा, या नया एडाप्टर बनाना और सेट करना होगा। एडाप्टर आपकी सूची का संदर्भ नहीं रखता है (यह केवल निर्माण पर आपकी सूची पर आरे को कॉल कर रहा है), इसलिए इसे अपडेट करने का कोई तरीका नहीं है।

dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, newStringList); 
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinnerCategory.setAdapter(dataAdapter); 
7

आप अपनी सूची में बदल डेटा है और जब आप स्पिनर को अद्यतन करने के चाहते तो

एडाप्टर की एक नई वस्तु बना सकते हैं और स्पिनर है कि अनुकूलक सेट करते हैं। यह निश्चित रूप से काम करेगा।

शुभकामनाएं।

संपादित करें: आपको एडाप्टर परडेटाडेट चेंज() को सूचित करने की भी आवश्यकता है।

1

अंतर्निहित डेटा बदलें और एडाप्टर पर NotifyDataSetChanged() को कॉल करें।

list.clear(); 
    list.add("A"); 
     list.add("B"); 
    dataAdapter.notifyDataSetChanged(); 
1

आप अपने डेटा को बदलने के बाद, आप निम्न कोड जोड़ने की आवश्यकता होगी:

typeList = dbAdapter.getList()    
adapter = new ArrayAdapter<String>(v.getContext(), 
    android.R.layout.simple_spinner_dropdown_item,typeList);    
groupSpinner.setAdapter(adapter); 
0

आप एक आप को खिलाया एक अलग सूची के बजाय typeList = dbAdapter.getList(), चर typeList अंक करना जाहिरा तौर पर के बाद एडाप्टर मूल रूप से और एडाप्टर कुछ हद तक उलझन में होगा।

तो आप निम्नलिखित कोड का उपयोग करना चाहिए:

typeList.clear(); 
typeList.addAll(dbAdapter.getList()); 
0

जब आप स्पिनर एडाप्टर की स्थापना जब आप नए डेटा यह स्वचालित रूप से अपडेट किया जाएगा जोड़ने पर

spinnerAdapter.setNotifyOnChange(true); 

जोड़ने तब से।

+0

ArrayAdapter के लिए, डिफ़ॉल्ट पहले से ही सत्य है। स्पिनरों के साथ उपयोग के लिए, इसका कोई प्रभाव नहीं पड़ता - जैसा कि पिछले उत्तरों पर टिप्पणियों में बताया गया है। –

2

आप मूल List को बस संशोधित नहीं कर सकते हैं तो notifyDataSetChanged() अन्य एडाप्टर पर कॉल करें, क्योंकि यह मूल List पर नहीं है।हालांकि, अगर आप एक ही परिणाम एडाप्टर खुद का उपयोग कर प्राप्त कर सकते हैं, जैसे इतना:

spinnerAdapter.clear(); 
spinnerAdapter.addAll(updatedListData); 
spinnerAdapter.notifyDataSetChanged(); // optional, as the dataset change should trigger this by default 

user392117 (https://stackoverflow.com/a/38738734/1508887)

+0

यह एक स्वीकार्य उत्तर होना चाहिए। – Smeet

0

से एक जवाब को जोड़ने का प्रयोग के आधार पर/अपने एडाप्टर पर हटाने और notifyDataSetChanged का उपयोग कर() आपको बार-बार नए एडेप्टर बनाने की सुविधा नहीं मिलती है।

अपने एडाप्टर वैश्विक

ArrayAdapter<Object> adapter; 

घोषित आप वस्तुओं अनुकूलक (स्ट्रिंग्स या जो कुछ भी ऑब्जेक्ट का उपयोग) से जुड़ा हुआ है की सूची के लिए कुछ जोड़ते हैं एडाप्टर के लिए एक ऐड समारोह जोड़ सकते हैं और फोन notifyDataSetChanged:

adaper.add(Object); 
adapter.notifyDataSetChanged(); 

और जब आप सूची से किसी आइटम को निकालने भी जोड़ें:

adapter.remove(Object); 
adapter.notifyDataSetChanged(); 
संबंधित मुद्दे