2012-09-19 41 views
12

में अतिरिक्त तत्व जोड़ें मेरे पास एक कर्सर है जिसमें मेरे डेटाबेस से सभी पंक्तियां हैं। वह कर्सर मैं कर्सर एडाप्टर को पास करता हूं, और एक सूची में डेटा प्रदर्शित करता हूं। लेकिन मुझे शुरुआत में एक अतिरिक्त तत्व दिखाना होगा। मैं उसे कैसे कर सकता हूँ?कर्सर एडाप्टर एंड्रॉइड

मैंने कहीं पढ़ा है कि शायद इसे कर्सरवापर के साथ किया जा सकता है, और यह परिणामों में अतिरिक्त मूल्यों को इंजेक्ट कर सकता है। लेकिन मुझे पूरा यकीन नहीं है कि यह कैसे करें।

अगर कोई मुझे एक उदाहरण (कोड) दिखा सकता है, या कोई अन्य विचार है कि इसे कैसे हल किया जाए, तो कृपया मुझे बताएं। धन्यवाद!

उत्तर

2

आप का उपयोग सूची दृश्य के addHeaderView() या addFooterView() कर सकते हैं:

TextView label = new TextView(context); 
label.setText("Something Here"); 

listView.addHeaderView(label); 

बस setAdapter() कॉल करने से पहले ऐसा करने के लिए सुनिश्चित करें। इस तरह

+1

यह पहली बार है जब मुझे एक ऐसा उत्तर दिखाई देता है जो वास्तव में एक अच्छा उपयोग केस संबोधित करता है और सरल है और [टैग: एंड्रॉइड] टैग के लिए तुरंत काम करता है। बहुत बहुत धन्यवाद, और मुझे आश्चर्य है कि यह जवाब ऊपर नहीं है। –

0

एडाप्टर में आप शायद getView विधि में अतिरिक्त डेटा दिखा सकते हैं। लेकिन यह थोड़े जहां डाटा, से आता है पर निर्भर करता है कि आप क्या आदि इसके साथ क्या करने के लिए (बस इसे प्रदर्शित?), चाहते

+0

मैंने कोशिश की है कि, लेकिन मान लें कि अगर मैं कर्सर में 6 आइटम नहीं हैं, getView 6 बार कहा जाता हो जाता है, इसलिए जब मैं अतिरिक्त आइटम जोड़ने, कर्सर से सभी आइटम नहीं दिखाई जातीं। हमेशा एक आइटम होता है जो कभी नहीं दिखाया जाता है .. यही कारण है कि मैं कर्सर – Sandra

+0

हां में अतिरिक्त आइटम जोड़ना चाहता था, लेकिन जब छुपा आइटम दृश्य में आता है, तो एडाप्टर पर 'getView'' कहा जाएगा, है ना? या मैं वास्तव में उलझन में हूँ! – manavo

+0

मैंने यह कोशिश की: getView कर्सर में आइटम्स के लिए नियमित रूप से कॉल किया जाता है, और यदि (स्थिति == 0) मैं अतिरिक्त आइटम जोड़ता हूं जो मुझे चाहिए। तो बाद में कर्सर में शेष वस्तुओं के लिए getView को कॉल किया जाता है, और अतिरिक्त पहले के साथ, हमेशा एक आइटम होता है जो कभी नहीं दिखाया जाता है। जब मैं अतिरिक्त आइटम जोड़ता हूं, तो मैंने एक और बार getView को कॉल करने का प्रयास किया, लेकिन यह ठीक से काम नहीं कर रहा है। हो सकता है क्योंकि मुझे नहीं पता कि कनवर्ट में क्या रखा जाए, फ़ंक्शन से पैरेंट वैरिएबल -> getView (int position, कन्वर्ट व्यू व्यू, व्यू ग्रुप पैरेंट) – Sandra

1

आप List<YourRow>, जहां YourRow अपने कर्सर से डेटा के लिए एक वर्ग है में Cursor से डेटा पढ़ सकते हैं पंक्ति। फिर बस अपने ListView के लिए BaseAdapter सूची बनाने के लिए नए YourRow आइटम जोड़ें और उपयोग करें। BaseAdapter से निपटने के तरीके को जानने के लिए this पढ़ें।

+0

Thx। फिर भी मुझे लगता है कि अगर मैं परिणाम में अतिरिक्त मूल्य इंजेक्ट कर सकता हूं तो यह थोड़ा आसान हो सकता है। क्या आप जानते हैं कि मैं कर्सरवापर का उपयोग करके ऐसा कैसे कर सकता हूं? मैंने यह पाया [https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QSOGjgL8kXI], लेकिन मुझे नहीं पता कि इसे कैसे पूरा किया जाए। – Sandra

1

डेटाबेस में एक अतिरिक्त तत्व जोड़कर मैंने इस समस्या को हल किया। यह सबसे आसान समाधान था, क्योंकि मुझे शुरुआत में अतिरिक्त तत्व की आवश्यकता थी। तो मेरा डेटाबेस बनाने के बाद, मैं उस तालिका में एक पंक्ति डालता हूं जिसके लिए मुझे इच्छित मानों के साथ अतिरिक्त तत्व की आवश्यकता होती है।

मुझे यह चर्चा भी मिली [https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QSOGjgL8kXI] इसलिए यदि किसी को भी ऐसी ही समस्या है, तो यह एक प्रारंभिक बिंदु होगा। धन्यवाद!

+0

आप @amukhachov जवाब भी देख सकते हैं। – Sandra

+0

मैंने वही किया .. यह एक अनौपचारिक सर्वोत्तम अभ्यास की तरह दिखता है –

+0

यह कुछ हद तक उचित समाधान होगा जब तक कि आप डेटाबेस प्रविष्टियों को हटाने/संशोधित करने के लिए कोई रास्ता प्रदान नहीं करते हैं, या किसी भी कारण से डीबी को रीसेट करने की आवश्यकता है। बेशक, यदि आपकी प्रविष्टियां उस स्थिर हैं तो शायद आपको किसी भी मामले में डीबी का उपयोग नहीं करना चाहिए। सबसे सरल, सबसे भविष्य-सबूत समाधान ऊपर दिए गए मेरे उत्तर में प्रदान किया गया है। – tbm

10

कैसे MergeCursor और MatrixCursor के संयोजन का उपयोग के रूप में मैं इस सवाल में सुझाव दिया है के बारे में: How to insert extra elements into a SimpleCursorAdapter or Cursor for a Spinner?

+0

मैंने डेटाबेस में एक अतिरिक्त तत्व जोड़ने का हल किया। लेकिन शायद आपने जो सुझाव दिया है उसका उपयोग करके किया जा सकता है। +1 – Sandra

+0

यह निश्चित रूप से सबसे अच्छा समाधान है; डीबी में सामग्री को muddying से कहीं ज्यादा बेहतर है। –

0

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

यहां एक प्रक्षेपण का एक उदाहरण है जिसका उपयोग मैंने किसी आइटम (सेंट में संग्रहीत) और संबंधित इकाई की कीमत के आधार पर लागत को प्रारूपित करने के लिए किया है। एक स्तंभ के रूप में अपने सूचीदृश्य को पारित करने के लिए है कि

public static final String CONCATE_COST 
     = "'$' || CASE WHEN SUBSTR(ROUND("+COLUMN_PRICE 
      +"/100.0, 2), LENGTH(ROUND("+COLUMN_PRICE 
      +"/100.0, 2))-1, 1)='.' THEN ROUND("+COLUMN_PRICE 
      +"/100.0, 2) || '0' else ROUND("+COLUMN_PRICE 
      +"/100.0, 2) end || "+COLUMN_UNIT; 

उपयोग और आप सीधे अपने दृश्य में एक क्षेत्र के साथ युग्मित कर सकते हैं।

0

उन मामलों में मेरा समाधान स्थिर मानों के साथ एक यूनियन क्वेरी निष्पादित करना है। पूर्व:

(चयन -1 आईडी के रूप में, नाम के रूप में, पता के रूप में "यहां पता जाता है" "ये सभी नाम जाता है") यूनिअन

(नाम से संपर्क आदेश से आईडी, नाम, पते का चयन करें)

(सिंटेक्स doublecheck, कृपया, मैं स्मृति से कर रहा हूँ)

इस तरह, आप के साथ -1 एक पहली पंक्ति मिल | नाम यहां डालें जाता है | यहां पता प्लस पंक्तियों

के बाकी जाता है तो, आप डेटाबेस को "प्रदूषण" नहीं कर रहे हैं और पहली पंक्ति को शर्तों के साथ चालू/बंद करना और concatenations के साथ खेलना आसान है।

4

अवहेलना getCount:

@Override 
public int getCount() { 
    final int count = super.getCount(); 
    return count+1; 
} 

और जो कभी अनुकूलक का उपयोग करता है एक अतिरिक्त पंक्ति हो जाता है। बस getView यानी में इसे संभालने के लिए याद रखें।

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(position == 0) { 
      final View v = inflater.inflate(R.layout.special_suggestion, parent,false); 
      final TextView tv = (TextView) v.findViewById(android.R.id.text1); 
      tv.setText("Search for '" + this.keyword + "'"); 
      return v; 
     } 
     else { 
      try { 
       return super.getView(position, convertView, parent); 
      } 
      catch (IllegalStateException e) { 
       Log.e(TAG, "IllegalStateException: " + e); 
      } 
     } 
     return inflater.inflate(this.layout, parent,false); 
    } 
+0

आपको 'position - 1'' super.getView' को पास करने की आवश्यकता नहीं है? एडाप्टर को पहले आइटम पर शुरू करना होगा जब आप सूची में पहले से ही उस स्थिति को ले चुके हैं? – ray