2012-03-11 21 views
5

मेरे पास 3 AutoCompleteTextViews हैं, और मैं उन पर 2 स्ट्रिंग [] एडाप्टर पंजीकृत करना चाहता हूं। वर्तमान में, मैं यह कर रहा हूँ:ऑटोकंपलेटटेक्स्ट व्यू एडाप्टर, "छुपा" एडाप्टर?

atw_from.setAdapter(new ArrayAdapter(ctx, android.r.layout.simple_dropdown_item_1line, stages_adapter)); 

मान लीजिए कि मेरे उपयोगकर्ता टाइप करने के लिए "Középmező" चाहता है, वह टाइप करने के लिए "Koze" शुरू होता है और वह इस तक, यह बहुत सरल है Középmező चयन करने के लिए की पेशकश की जाएगी। लेकिन क्या होगा यदि उपयोगकर्ता उच्चारण टाइप करने के लिए बहुत आलसी है (और उनमें से बहुत आलसी हैं), इस प्रकार वह केवल कोज़ेमेज़ो टाइप करेगा, तो उसे कोई प्रस्ताव नहीं मिलेगा, क्योंकि मेरे स्ट्रिंग में कोई कोज़ेमेज़ो नहीं है []। जो चीज मैं चाहता हूं वह है, यदि वह "कोज़" में टाइप करता है, तो उसे कोज़ेपेमेज़ो की पेशकश की जानी चाहिए, इसलिए यदि वह उच्चारण का उपयोग नहीं करता है, तो उसे हमेशा उच्चारण के साथ वास्तविक शब्द की पेशकश की जाएगी।

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

जो मैं समझता हूं, मुझे एक पूर्ण कस्टम एडाप्टर बनाना चाहिए। क्या यह सबसे अच्छा तरीका है, या एसडीके में कोई समाधान शामिल है? अगर मुझे कस्टम एडेप्टर बनाना चाहिए, तो क्या कोई मुझे सही दिशा में इंगित कर सकता है कि यह कैसे करें? :)

संपादित करें: अपना खुद का जवाब जोड़ा, सभी के लिए काम करना चाहिए, दूसरे जवाब के लिए चीयर्स, जिसने मुझे अच्छी दिशा में निर्देशित किया!

उत्तर

1

शाबाशी, इस के साथ काम कर पिछवाड़े में दर्द का एक बहुत कुछ करने के बाद, यहाँ बात मैं अंत में किया है। यह बिल्कुल अच्छा अभ्यास नहीं है, और मैं इसे गलत कर सकता हूं, लेकिन कम से कम यह अब पूरी तरह से काम कर रहा है।

बस ctrl + c, ctrl + v BaseAdapter का स्रोत कोड, और ctrl + c, ctrl + v ArrayAdapter का स्रोत कोड। अब निजी आंतरिक वर्ग, ऐरेफिल्टर, विशेष रूप से प्रदर्शनफिल्टरिंग विधि देखें। संशोधित करें (ओवरराइड नहीं!) जितना चाहें उतना, मेरे मामले में, मैंने बहुत सारे स्थान को जोड़ा। ("X", "y") चीज़ों, deaccenting भाग के लिए।

जो भी मैंने कोशिश की, या तो अप्रत्याशित बल उत्पन्न हुआ (बहुत, और पूरी तरह से यादृच्छिक वाले), या मैं इसे नहीं कर सका, क्योंकि संरक्षित के बजाय बहुत अधिक विधियां/चर निजी हैं। मुझे कहना होगा, Google कोeseese कोडों पर फिर से जाना चाहिए ...

नोट: आपको वास्तव में ctrl + c ctrl + v बेसएडाप्टर कोड की आवश्यकता नहीं है, क्योंकि यह एक सार्वजनिक सार वर्ग है, लेकिन हे, यह नहीं है एक कोड का अधिकांश, और इस तरह सबकुछ वहां है, जो आपके लिए स्पष्ट रूप से दिखाई देता है।

चीयर्स

+0

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

+0

मैं हमेशा बेहतर समाधान में रुचि रखते हैं! :) यदि आपको कोई फर्क नहीं पड़ता, तो मैं इसे देख लूंगा। वैसे भी, आपके जवाब ने मुझे दिशा में इंगित किया, जिसने मुझे अपनी समस्या का समाधान किया, इसलिए आपके लिए पहले से ही एक बड़ा थक्स। इसके अलावा मैं इस ArrayAdapter के कुछ हिस्सों को पूरी तरह से लिखने के बारे में सोच रहा था, क्योंकि सामान्य रूप से, यह स्थिर हो सकता है, लेकिन मेरे मामले में, इसे कुछ अतिरिक्त सरणी की आवश्यकता नहीं होगी, इस प्रकार फ़िल्टरिंग की आवश्यकता वाले स्मृति/सीपीयू समय को कम किया जाएगा। – hundeva

+0

ठीक है, मैंने कुछ कोड जोड़ा है जो मैं वर्तमान में अपने पहले के जवाब में अपनी परियोजनाओं में से एक में उपयोग कर रहा हूं। आपके लिए सबसे दिलचस्प बिट ओवरराइड 'getFilter' विधि होगा। उम्मीद है कि यह आपको समझ में आएगा। :) –

0

इस सूत्र remove-accents-from-string और एंड्रॉयड Normalizer वर्ग पर एक नज़र डालें

[संपादित करें] या आप दोनों सरणियों के साथ merge-adapter की कोशिश कर सकते

+0

मुझे डर है कि यह वह नहीं है जिसे मैं ढूंढ रहा हूं:/वैसे भी जवाब। – hundeva

1

मैं वास्तव में, एक कस्टम एडाप्टर के लिए जाना है, जिसमें आप अपने खुद के प्रदान करेगा फ़िल्टर फ़ंक्शन दोनों उच्चारण और निर्विवाद नोटेशन पर मिलान करने के लिए।

ऐसा करने के लिए एक उदाहरण कार्यान्वयन, here पाया जा सकता है। असल में आपको performFiltering में वास्तविक फ़िल्टरिंग को लागू करने की आवश्यकता होगी - मुझे लगता है कि आपके पास पहले से ही निर्विवाद प्रश्नों का एक तरीका है, क्योंकि आप वर्तमान में अपने String[] को निर्विवाद संस्करणों के साथ पॉप्युलेट कर रहे हैं। आप अपनी सरणी में प्रविष्टियों के खिलाफ और बिना उच्चारण के क्वेरी के साथ तुलना करना चाहते हैं (जिसे आप उच्चारण के साथ और बिना उपयोग करना चाहते हैं)। अंत में आप निम्नलिखित चार टेस्ट कम से कम होना चाहिए:

accented(query) -> accented(entry) 
accented(query) -> deaccented(entry) 
deaccented(query) -> accented(entry) 
deaccented(query) -> deaccented(entry) 

ऑन-द-मक्खी शब्द deaccenting से, आप केवल, उच्चारण चिह्न शब्दों के साथ String[] प्रदान करना होगा, जबकि छानने तर्क (अपने एडाप्टर में) (डी) उच्चारण शब्दों के खिलाफ मिलान करने का ख्याल रखेगा।

संपादित करें: जैसा कि मेरी चल रही परियोजनाओं में से एक में नमूना कार्यान्वयन के नीचे चर्चा की गई है।

कुछ संकेत दिए गए:

  1. CustomArrayAdapter ज्यादातर एक आवरण वर्ग कि सामान्य कार्यों को सरल है, जैसे एक पंक्ति रैपर/धारक धारक के साथ बातचीत। असल में इसकी जरूरत है updateRow (जो स्पष्ट रूप से सुपर क्लास 'getView विधि से बुलाया जाएगा) का एक कन्स्ट्रक्टर और कार्यान्वयन है।
  2. CustomRowWrapper बहुत सरल होना चाहिए।
  3. ArrayUtil और ArrayUtil.FilterFuction वास्तविक फ़िल्टरिंग का ख्याल रखना। बस इन कार्यों को लूप के प्रतिस्थापन के रूप में कहा गया है जो कुछ मानदंडों से मेल खाने वाली सभी वस्तुओं की एक नई सूची बनाता है।

public class CARMedicationSuggestionAdapter extends CustomArrayAdapter<CARMedicationInfo, RowWrapper> { 

    private List<CARMedicationInfo> mMedications; 
    private Filter mFilter; 

    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    * constructor 
    * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 

    public CARMedicationSuggestionAdapter(Context context, List<CARMedicationInfo> objects) { 
     super(RowWrapper.class, context, R.layout.medication_suggestion_item_layout, objects); 
     // keep copy of all items for lookups 
     mMedications = new ArrayList<CARMedicationInfo>(objects); 
    } 

    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    * update row 
    * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 

    @Override protected void updateRow(RowWrapper wrapper, CARMedicationInfo item) { 
     wrapper.getNameTextView().setText(item.toString()); 
    } 

    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    * get filter 
    * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 

    @Override public Filter getFilter() { 
     // return if already created 
     if (mFilter != null) return mFilter; 
     mFilter = new Filter() { 
      @Override protected void publishResults(CharSequence constraint, FilterResults results) { 
       @SuppressWarnings("unchecked") List<CARMedicationInfo> filtered = (List<CARMedicationInfo>) results.values; 
       if (results == null || results.count == 0) return; 
       // clear out current suggestions and add all new ones 
       clear(); 
       addAll(filtered); 
      } 

      @Override protected FilterResults performFiltering(final CharSequence constraint) { 
       // return empty results for 'null' constraint 
       if (constraint == null) return new FilterResults(); 
       // get all medications that contain the constraint in drug name, trade name or whose string representation start with the constraint 
       List<CARMedicationInfo> suggestions = ArrayUtil.filter(mMedications, new ArrayUtil.FilterFunction<CARMedicationInfo>() { 
        @Override public boolean filter(CARMedicationInfo item) { 
         String query = constraint.toString().toLowerCase().trim(); 
         return item.mMedicationDrugName.toLowerCase().contains(query) || 
           item.mMedicationTradeName.toLowerCase().contains(query) || 
           item.toString().toLowerCase().startsWith(query); 
        } 
       }); 
       // set results and size 
       FilterResults filterResults = new FilterResults(); 
       filterResults.values = suggestions; 
       filterResults.count = suggestions.size(); 
       return filterResults; 
      } 
     }; 
     return mFilter; 
    } 

    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    * row wrapper 
    * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 

    static class RowWrapper extends CustomRowWrapper { 

     private ImageView mIconImageView; 
     private TextView mNameTextView; 

     public RowWrapper(View row) { 
      super(row); 
     } 

     public ImageView getIconImageView() { 
      if (mIconImageView == null) mIconImageView = (ImageView) mRow.findViewById(R.id.icon_imageview); 
      return mIconImageView; 
     } 

     public TextView getNameTextView() { 
      if (mNameTextView == null) mNameTextView = (TextView) mRow.findViewById(R.id.name_textview); 
      return mNameTextView; 
     } 

    } 

} 
+0

यह वास्तव में बहुत अच्छा लगता है, मैं इसे आज रात कोशिश करूँगा, जब मैं अपने डेवलपर लैपटॉप पर होगा, thx! यदि यह काम करता है, तो मैं इसे उत्तर के उत्तर के रूप में स्वीकार करूंगा :) – hundeva

+0

मैंने आपको थोड़ी देर पहले उपहार दिया था, और यह इस तरह रहेगा, लेकिन मैं एक मिनट में एक अलग उत्तर देने वाला हूं – hundeva

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