2010-04-20 19 views
7

का उपयोग कर आइटम स्थिति या आईडी पर क्लिक करें मैं एंड्रॉइड विकास के लिए नया हूं और मैं एक समस्या में भाग गया जिसे मुझे हल करना मुश्किल लगता है। मैं यह पता लगाने की कोशिश कर रहा हूं कि AutoCompleteTextView विजेट का सही तरीके से उपयोग कैसे करें। मैं एक वेब सेवा से एक्सएमएल डेटा का उपयोग कर AutoCompleteTextView बनाना चाहता हूं। मैं इसे काम करने में कामयाब रहा, लेकिन मैं निश्चित रूप से आउटपुट से प्रसन्न नहीं हूं।AutoCompleteTextView onItem हैश मैप

मैं HashMap आईडी => नाम जोड़े के साथ AutoCompleteTextView में डाल देना चाहता हूं और क्लिक किए गए आइटम की आईडी प्राप्त करना चाहता हूं। जब मैं स्वत: पूर्ण फ़िल्टर किए गए सेट आउटपुट पर क्लिक करता हूं, तो मैं स्वत: पूर्णता बॉक्स के नीचे एक सूची पॉप्युलेट करना चाहता हूं, जिसे मैं काम करने में भी कामयाब रहा।

अब तक डन:

  • स्वत: पूर्ण सरल ArrayList के लिए अच्छी तरह से काम करता है, सभी डेटा सही फ़िल्टर्ड
  • onItemClick घटना आग ठीक से करने के बाद क्लिक
  • parent.getItemAtPosition (स्थिति) रिटर्न क्लिक किए गए की सही स्ट्रिंग प्रतिनिधित्व आइटम

इटैमक्लिक (एडाप्टर व्यू पेरेंट, व्यू वी, इंट पोजिशन, लांग आईडी) पर इवेंट का व्यवहार नहीं करता है जैसा मैं चाहूंगा। मैं क्लिक किए गए आइटम की unfiltered सरणी स्थिति को कैसे समझ सकता हूं? एक फ़िल्टर की स्थिति एक मैं में दिलचस्पी नहीं है है

आगे के प्रश्न:।

  • कैसे AutoCompleteTextView में HashMaps या संग्रह को संभालने के लिए
  • कैसे onItemClick घटना
  • में सही Itemid पाने के लिए

मैंने इस मुद्दे पर बहुत व्यापक शोध किया, लेकिन मुझे कोई भी मूल्यवान जानकारी नहीं मिली जो मेरे सवालों का जवाब देगी।

+0

क्या आप 'फ़िल्टर करने योग्य' को लागू कर रहे हैं, और 'फ़िल्टर # प्रदर्शनफिल्टरिंग()' और 'फ़िल्टर # प्रकाशन परिणाम()' विधियों का उपयोग कर रहे हैं? – Joe

+0

मुझे भी एक ही समस्या का सामना करना पड़ रहा है .... कृपया समाधान समाधान दें – sarath

उत्तर

-1

कैसे AutoCompleteTextView

आप अपने स्वयं के कस्टम एडाप्टर सेट कर सकते हैं में HashMaps या संग्रह को संभालने के लिए। आपके एडाप्टर में यह आपके ऊपर है जहां आप किसी दिए गए स्थान पर अपना डेटा प्राप्त करते हैं।

कैसे onItemClick घटना

अपने कस्टम अनुकूलक में सही Itemid प्राप्त करने के लिए, आप एक फ़िल्टर को परिभाषित है, और उस फिल्टर सुझाव दिया आइटम निर्धारित करता है। आपके पास दो अलग-अलग सूची हैं, मूल मूल्यों वाला एक और फ़िल्टर किए गए आइटमों वाला दूसरा। मेरा मतलब कुछ ऐसा है।

private class AutoCompleteItemAdapter extends ArrayAdapter<YourItemClass> implements Filterable { 

    private NameFilter  mFilter; 
    List<YourItemClass> suggestions; 
    List<YourItemClass> mOriginalValues; 

    public AutoCompleteItemAdapter(Context context, int resource, List<YourItemClass> suggestions) { 
     super(context, resource, suggestions); 
     this.suggestions = suggestions; 
     this.mOriginalValues = suggestions; 
    } 

    public void updateData(List<YourItemClass> suggestions) { 
       mLock.lock(); 
       try{ 
        this.suggestions = suggestions; 
         this.mOriginalValues = suggestions; 
      finally{ 
       mLock.unlock(); 
      } 
     } 

    @Override 
    public int getCount() { 
     mLock.lock(); 
     try { 
      return suggestions.size(); 
     } finally { 
      mLock.unlock(); 
     } 
    } 

    @Override 
    public YourItemClass getItem(int position) { 
     return mOriginalValues.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // draw your item here... 
    } 

    @Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new NameFilter(); 
     } 
     return mFilter; 
    } 

    private class NameFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      FilterResults results = new FilterResults(); 

      if (mOriginalValues == null) { 
       mLock.lock(); 
       try { 
        mOriginalValues = new ArrayList<YourItemClass>(suggestions); 
       } finally { 
        mLock.unlock(); 
       } 
      } 

      if (prefix == null || prefix.length() == 0) { 
       mLock.lock(); 
       try { 
        ArrayList<YourItemClass> list = new ArrayList<YourItemClass>(mOriginalValues); 
        results.values = list; 
        results.count = list.size(); 
       } finally { 
        mLock.unlock(); 
       } 
      } else { 
       String prefixString = prefix.toString().toLowerCase(); 

       final List<YourItemClass> values = mOriginalValues; 
       final int count = values.size(); 

       final ArrayList<YourItemClass> newValues = new ArrayList<YourItemClass>(count); 

       //    FILTERING 
       // 
        // add your hits to the newValues collection 
       // 
       // 
       results.values = newValues; 
       results.count = newValues.size(); 
      } 
      return results; 
     } 


     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      mLock.lock(); 
      try { 
       if (results == null || results.values == null) return; 
       suggestions = new ArrayList<YourItemClass>(); 
       suggestions = (List<YourItemClass>) results.values; 
       if (results.count > 0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } finally { 
       mLock.unlock(); 
      } 
     } 
    } 
} 

अब यह कुछ संगामिति मुद्दा है, हम के रूप में संदर्भ तक बढ़ाई जा सकती एडाप्टर सूची के आकार के लिए पूछ सकते हैं, और एक बड़ा मूल्य बाहर चला जाता है, getView समारोह में समस्या का कारण हो सकता है। (fi .: अंतर्निहित डेटा के साथ 5 तत्व खींचने का प्रयास केवल 4 है, क्योंकि हमने एक और फ़िल्टरिंग किया है) इस तरह हमने अपने AutoCompleteTextView का उपयोग किया, और अब तक यह बहुत अच्छा काम करता है, कोई समस्या नहीं है। मैंने अभी उल्लेख किया है कि मैं अभी भी चिंतित हूं, और मुझे यह अस्पष्ट अनुभव है कि इसके लिए एक बेहतर समाधान है।

अपने ऑनक्लिक श्रोता में, आप अपने मानचित्र में कुंजी के रूप में लौटाए गए मूल्य (फ़िल्टर की गई सूची से) का उपयोग करते हैं, और संबंधित मान प्राप्त करते हैं।आप अपनी सूची को HashMap के लिए एक इंडेक्स का उपयोग कर सकते हैं। इसके बाद, आप अपना आइटम खींचने के लिए, या अपना डेटा प्राप्त करने के लिए अपने Map का उपयोग कर सकते हैं।

+0

-1: यह ओपी के प्रश्न का उत्तर नहीं देता है। '... आप अपने मानचित्र में कुंजी के रूप में लौटाए गए मूल्य (फ़िल्टर की गई सूची से) का उपयोग करते हैं ...' - नहीं, नहीं, नहीं। फ़िल्टर की गई सूची से * मान * एक * कुंजी * नहीं है। –

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