2010-08-16 19 views
9

मेरे पास एक गतिविधि है जो ListView को बढ़ाती है। मैं अपनी सूची को SQL क्वेरी डेटाबेस में एक क्वेरी के परिणामों के साथ पॉप्युलेट करता हूं। एक सूची तत्व में start_time, end_time, client_name और स्थिति शामिल होती है। ये जानकारी पर 4 बिट्स हैं जिन्हें मुझे प्रत्येक सूची आइटम के लिए प्रदर्शित करने की आवश्यकता है।किसी सूचीदृश्य आइटम में छिपे हुए मान निर्दिष्ट करना

मेरा प्रश्न है: क्या मेरे लिए इस सूची दृश्य आइटम में छिपा तत्व असाइन करना संभव है?

उदाहरण के लिए, मैं उस सूची दृश्य आइटम के लिए डेटाबेस पंक्ति के _id फ़ील्ड को स्टोर करना चाहता हूं, ताकि जब मैं इसे क्लिक करूं तो मैं उस डेटाबेस पंक्ति के डेटा के आधार पर एक नई गतिविधि शुरू कर सकता हूं।

संपादित

कोड मैं अपने कर्सर से मेरी सूची को भरने के लिए उपयोग करें:

String[] columns = new String[] {VisitsAdapter.KEY_CLIENT_FULL_NAME, VisitsAdapter.KEY_STATUS,VisitsAdapter.KEY_CLIENT_START_TIME, VisitsAdapter.KEY_CLIENT_END_TIME}; 

// the XML defined views which the data will be bound to 
int[] to = new int[] { R.id.name_entry,R.id.number_entry,R.id.start_time_display,R.id.end_time_display }; 

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(HomeScreen.this, R.layout.list_element, cur, columns, to); 

कहाँ R.layout.list_item मेरी सूची आइटम के लिए एक्सएमएल है। मैं एक पीएचपी/एचटीएमएल पृष्ठभूमि से आया हूं, इसलिए मैं आमतौर पर जो करता हूं वह मेरे _id मान को पकड़ने के लिए एक छिपी हुई फ़ील्ड है जिसे मैं सूची आइटम पर क्लिक करने के बाद एक्सेस कर सकता था। क्या मैं एंड्रॉइड में कुछ ऐसा कर सकता हूं? क्या मैं अपने एक्सएमएल लेआउट में एक छुपा _id फ़ील्ड डाल सकता हूं?

उत्तर

19

आपको अपने आप को वेब विकास फ्रेम से थोड़ा सा ढीला करने की कोशिश करनी चाहिए। आईडी को आपके दृश्य में एक छिपे हुए क्षेत्र में स्टोर करने की कोई आवश्यकता नहीं है। यह आपके डेटा को आपके यूजर इंटरफेस के साथ मिश्रित करेगा और बहुत भ्रम और अनावश्यक दृश्य वस्तुएं पैदा करेगा।

यदि आप अपने मूल्यों को संग्रहीत करने के लिए एक स्क्लाइट डेटाबेस का उपयोग कर रहे हैं तो आपको अपनी सूची वस्तुओं के प्रबंधक के लिए CursorAdapter का उपयोग करना चाहिए। कर्सर एडाप्टर उस परिणाम को संग्रहीत करता है जो आपको डेटाबेस से मिला है और यह प्रबंधित करता है कि उपयोगकर्ता को डेटा कैसे प्रदर्शित किया जाता है। यदि आप अपने ListView पर onItemClickListener पंजीकृत करते हैं तो श्रोता एडाप्टर और डेटा आइटम की स्थिति प्राप्त करेगा जिसका सेल एडाप्टर में क्लिक किया गया था। अब आप डेटाबेस परिणाम को इंगित करने वाले कर्सर को पुनर्प्राप्त करने के लिए getItem का उपयोग कर सकते हैं जिसका उपयोग सूचीकरण बनाने के लिए किया गया था। अब आप आईडी या अन्य सभी मान प्राप्त कर सकते हैं जो उपयोगकर्ता को डेटाबेस परिणाम से नहीं दिखाए जाते हैं और अगली गतिविधि शुरू करने के इरादे से संलग्न करते हैं।

+0

जब आप कहते हैं कि मुझे कर्सर एडाप्टर का उपयोग करना चाहिए, तो क्या आपका मतलब है कि मेरे उदाहरण कोड में SimpleCursorAdapter पर निर्भर है? –

+2

आपकी प्रतिक्रिया के लिए धन्यवाद। सूची आइटम श्रोताओं पर दस्तावेज़ों की खोज करने के बाद मैंने पाया है कि onListItemClick स्वचालित रूप से कर्सर परिणाम की पंक्ति आईडी को पास करता है। (डेटाबेस से _id कॉलम)। मैं इस सब गलत के बारे में जा रहा था (जैसा कि आपने बताया) जैसा कि मैंने माना है कि मुझे इसे मैन्युअल रूप से सूची आइटम में जोड़ना होगा, मुझे एहसास नहीं हुआ कि एंड्रॉइड स्वचालित रूप से इसका ख्याल रखता है। धन्यवाद, उत्तर स्वीकार किया गया। अच्छा स्पष्टीकरण के लिए –

+0

+1 ... लेकिन सरल एडाप्टर के मामले में मैं इसे कैसे प्राप्त कर सकता हूं? – hemu

1

आपको एक जावा वस्तु बनाने पर विचार करना चाहिए जो यह सारी जानकारी एकत्र करेगा। उदाहरण के लिए, यदि आप "ListItem" की तरह एक वर्ग बना सकते हैं और प्रत्येक आइटम 5 गुण होता है:
start_time
end_time
CLIENT_NAME
स्थिति आईडी (और अधिक करता है, तो आप की जरूरत)

और फिर, आप 2 विकल्प हैं, या तो आप पूरे ऑब्जेक्ट को डेटाबेस में रखने के लिए ऑब्जेक्ट को क्रमबद्ध करते हैं, या आप जो संरचना पहले से रखते हैं उसे रखते हैं (मुझे लगता है), और आपके डेटाबेस की प्रत्येक पंक्ति ListItem ऑब्जेक्ट बन जाती है। फिर, जब आप अपने डेटाबेस से पूछताछ करते हैं, तो आप उन्हें सभी को एक ArrayList में डाल देते हैं, और अपने स्वयं के एडाप्टर बनाने के लिए ArrayAdapter का विस्तार करते हैं। अंत में, getView विधि में, आप myListItem.getEnd_Time पर कॉल करते हैं और आपके डेटा को प्रदर्शित करने के लिए आवश्यक सभी विधियों को कॉल करें, और बस getId का उपयोग न करें, जिसे आप ऑब्जेक्ट की आवश्यकता होने पर सीधे एडाप्टर से उपयोग कर सकते हैं।

+0

क्षमा sephy, मैं काफी एंड्रॉयड के लिए नए और मैं वास्तव में अपने जवाब का पालन न, Ive प्रासंगिक कोड जहां इम –

+0

से आ रही दिखाने के लिए तैनात जब लोग आपको सामान की व्याख्या करने के लिए समय लेते हैं और आप उन्हें वोट देते हैं तो उत्तर का इलाज करने का वह तरीका क्या है। मैं विश्वास नहीं कर सकता। – Sephy

+0

हाय सेफी, मुझे यह इंगित करना चाहिए कि यह वह नहीं था जिसने आपके उत्तर को डाउनग्रेड किया था। मैं आपकी प्रतिक्रिया की सराहना करता हूं और आपके प्रश्न को देखने के लिए आपने जो समय लिया था। मैं नहीं कह सकता कि इसे किसने डाउनग्रेड किया क्योंकि मुझे नहीं पता। Kuroutadori उत्तर के लिए भी यही है। –

0

आप _ id के अलावा अन्य db कॉलम गैर प्रदर्शित करना, आपकी ListView के onItemClick (...) में की जरूरत है तुम सिर्फ फोन:

mAdapter.getCursor(); 

तो फिर तुम चयनित सूची में से किसी गैर प्रदर्शित कॉलम प्राप्त कर सकते हैं आइटम/पंक्ति।

Janusz, उल्लेख किया है अगर आप केवल _ id की जरूरत है, सिर्फ फोन:

mAdapter.getItemId(); 
संबंधित मुद्दे