2012-10-10 19 views
6

यह मेरे प्रश्न का पालन करने पहले यहां है: Android: Autocomplete TextView Similar To The Facebook Appकस्टम एडाप्टर के साथ MultiAutoCompleteTextView प्रदर्शित करता है garbled स्ट्रिंग

पृष्ठभूमि:

सवाल (यदि उपरोक्त लिंक पोस्ट) में मेरे आवश्यकता एक AutoCompleteTextView फेसबुक ऐप और कई अन्य लोगों को भी में इस्तेमाल एक के समान है करने के लिए किया गया था। समाधान एक बहु-रेखा MultiAutoCompleteTextView का उपयोग करना था, यह विचार था कि स्थिति अपडेट करते समय उपयोगकर्ताओं को सीधे अपने मित्र नाम टाइप करें। उत्तर में समाधान एक स्टैंडअलोन दृष्टिकोण से ठीक काम करता है। हालांकि, जब मैंने अपने मौजूदा कोड में समाधान को एकीकृत करने के लिए देखा, तो यह अभी भी सही ड्रॉप-डाउन और सभी के साथ काम करता है। मैं यहां से एक समाधान के लिए धन्यवाद दोस्तों के फ़िल्टर की सूची: https://stackoverflow.com/a/12363961/1350013। मैं समाधान से GridView के बजाय BaseAdapter के साथ एक कस्टम ListView का उपयोग करता हूं।

समस्या:

मेरे कोड एक BaseAdapter जो Filterable लागू करता है का उपयोग करता है। जैसा ऊपर बताया गया है, ठीक काम करता है।

जब मैं फ़िल्टर की गई सूची से किसी मित्र का चयन करता हूं, तो समस्या कहां होती है। चयन के बाद MultiAutoCompleteTextView, यह प्रदर्शित करता है: @[email protected] मित्र के नाम के बजाय। गंदे पाठ के बजाय नाम दिखाने के लिए मुझे क्या बदलना होगा? यदि यह मदद करता है, तो जिस कक्षा में मैं इसे चलाता हूं वह SherlockActivity बढ़ाता है और SherlockListActivity नहीं।

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

कोड ब्लॉक

मेरी पहले सवाल से समाधान से Tokenizer। शीर्ष (onCreate() विधि में)

editStatusUpdate = (MultiAutoCompleteTextView) findViewById(R.id.editStatusUpdate); 
editStatusUpdate.addTextChangedListener(filterTextWatcher); 

editStatusUpdate.setTokenizer(new Tokenizer() { 

    @Override 
    public CharSequence terminateToken(CharSequence text) { 

     int i = text.length(); 

     while (i > 0 && text.charAt(i - 1) == ' ') { 
      i--; 
     } 

     if (i > 0 && text.charAt(i - 1) == ' ') { 
      return text; 
     } else { 
      if (text instanceof Spanned) { 
       SpannableString sp = new SpannableString(text + " "); 
       TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0); 
       return sp; 
      } else { 
       return text.toString() + " "; 
      } 
     } 
    } 

    @Override 
    public int findTokenStart(CharSequence text, int cursor) { 

     int i = cursor; 

     while (i > 0 && text.charAt(i - 1) != '@') { 
      i--; 
     } 

     if (i < 1 || text.charAt(i - 1) != '@') { 
      return cursor; 
     } 

     return i; 
    } 

    @Override 
    public int findTokenEnd(CharSequence text, int cursor) { 

     int i = cursor; 
     int len = text.length(); 

     while (i < len) { 
      if (text.charAt(i) == ' ') { 
       return i; 
      } else { 
       i++; 
      } 
     } 

     return len; 

    } 
}); 

TextWatcher पर जुड़ा हुआ है, यह भी पहले प्रश्न का हल से:

private TextWatcher filterTextWatcher = new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 

     Layout layout = editStatusUpdate.getLayout(); 
     int pos = editStatusUpdate.getSelectionStart(); 
     int line = layout.getLineForOffset(pos); 
     int baseline = layout.getLineBaseline(line); 

     int bottom = editStatusUpdate.getHeight(); 

     editStatusUpdate.setDropDownVerticalOffset(baseline - bottom); 

    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 

    } 
}; 

मेरी ArrayList के लिए:

public class getFriends { 

    String friendID; 
    String friendName; 
    String friendProfile; 

    boolean selected; 

    // SET FRIENDS ID 
    public void setFriendID(String friendID) { 
     this.friendID = friendID; 
    } 

    // GET FRIENDS ID 
    public String getFriendID() { 
     return friendID; 
    } 

    // SET FRIENDS NAME 
    public void setFriendName(String friendName) { 
     this.friendName = friendName; 
    } 

    // GET FRIENDS NAME 
    public String getFriendName() { 
     return friendName; 
    } 

    // SET FRIENDS PROFILE 
    public void setFriendProfile(String friendProfile) { 
     this.friendProfile = friendProfile; 
    } 

    // GET FRIENDS PROFILE 
    public String getFriendProfile() { 
     return friendProfile; 
    } 
} 
+0

मैंने दूसरे प्रश्न के कोड को नहीं देखा है, लेकिन ऐसा लगता है कि विधि 'toString' को आपके' getFriends 'वर्ग (रास्ते में भयानक नामकरण) के लिए बुलाया जा रहा है।'GetFriends' क्लास में ओवरराइड' toString' विधि जोड़ने का प्रयास करें, इस तरह कुछ: '@ ओवरराइड पब्लिक स्ट्रिंग टूस्ट्रिंग() {वापसी दोस्त नाम;}' और देखें कि क्या होता है। – Luksprog

+0

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

+1

मैंने "भयानक" का उपयोग करके अतिरंजित किया है, ऐप के साथ ठीक से काम करने में कोई समस्या नहीं है, बस यह है कि आपको जावा सम्मेलनों (कक्षा के नाम के लिए पूंजी पत्र) का उपयोग करना चाहिए। साथ ही, शायद 'getFriends' इतना अच्छा विकल्प नहीं है, उदाहरण के लिए जब मैंने पहली बार अपना प्रश्न पढ़ा' getFriends' एक विधि नाम की तरह लग रहा था, न कि कक्षा। आपकी कक्षा के रूप में यह डेटा धारक है 'फ्रेंडडाटा' या 'मित्र सूचना' जैसे नाम आपके कोड को पढ़ने वाले व्यक्ति के लिए अधिक अभिव्यक्तिपूर्ण नाम हो सकता है। यह कुछ महत्वपूर्ण नहीं है लेकिन यदि आपके पास अन्य व्यक्ति इसे पढ़ रहे हैं तो आप उन्हें कोड को समझने में मदद करेंगे। – Luksprog

उत्तर

6

से आंकना आउटपुट आपको लगता है कि यह कोड आपके getClass ऑब्जेक्ट्स पर toString विधि को डेटा को पुनर्प्राप्त करने के लिए कॉल करता है। आप इस तरह से मित्र का नाम आप अपने खुद के toString विधि (यह अधिभावी द्वारा) को लागू करना चाहिए चाहते हैं के रूप में:

@Override 
public String toString() { 
    return friendName; 
} 
+1

ऐसा नहीं किया जाना चाहिए (और मैं यह भी कहूंगा कि यह गलत है), इस रूपांतरण के लिए नामित विधियां हैं। आपको स्ट्रिंग विधि को फ़ंक्शंस पर भरोसा नहीं करना चाहिए। – Heinrisch

14

आप अपने फिल्टर, जहां वस्तु अपने वर्ग है में convertResultToString(Object resultValue) ओवरराइड करना चाहिए। इससे स्ट्रिंग विधि को ओवरराइड करने पर भरोसा किए बिना कक्षा के लिए कस्टम स्ट्रिंग बनाना संभव हो जाता है।

+2

यह स्वीकार्य उत्तर होना चाहिए। यह अंतर्राष्ट्रीयकरण के साथ बेहतर काम करता है क्योंकि आपको अपने मॉडल ऑब्जेक्ट में एप्लिकेशन संदर्भ प्राप्त करने की आवश्यकता नहीं है। – alaeri