यह मेरे प्रश्न का पालन करने पहले यहां है: 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;
}
}
मैंने दूसरे प्रश्न के कोड को नहीं देखा है, लेकिन ऐसा लगता है कि विधि 'toString' को आपके' getFriends 'वर्ग (रास्ते में भयानक नामकरण) के लिए बुलाया जा रहा है।'GetFriends' क्लास में ओवरराइड' toString' विधि जोड़ने का प्रयास करें, इस तरह कुछ: '@ ओवरराइड पब्लिक स्ट्रिंग टूस्ट्रिंग() {वापसी दोस्त नाम;}' और देखें कि क्या होता है। – Luksprog
पहले। टिप्पणी में समाधान तुरंत काम किया। तो कृपया इसे एक उत्तर के रूप में जोड़ें और मैं इसे स्वीकार करूंगा (सेट बाउंटी के साथ) :-)। दूसरा। कक्षा का नाम देने का एक बेहतर तरीका क्या होगा? जब आप भयानक कहते हैं, तो क्या यह ऐप खराब होने के लिए कोई चिंता उठाता है? या यह सिर्फ बुरा नामकरण अभ्यास है? –
मैंने "भयानक" का उपयोग करके अतिरंजित किया है, ऐप के साथ ठीक से काम करने में कोई समस्या नहीं है, बस यह है कि आपको जावा सम्मेलनों (कक्षा के नाम के लिए पूंजी पत्र) का उपयोग करना चाहिए। साथ ही, शायद 'getFriends' इतना अच्छा विकल्प नहीं है, उदाहरण के लिए जब मैंने पहली बार अपना प्रश्न पढ़ा' getFriends' एक विधि नाम की तरह लग रहा था, न कि कक्षा। आपकी कक्षा के रूप में यह डेटा धारक है 'फ्रेंडडाटा' या 'मित्र सूचना' जैसे नाम आपके कोड को पढ़ने वाले व्यक्ति के लिए अधिक अभिव्यक्तिपूर्ण नाम हो सकता है। यह कुछ महत्वपूर्ण नहीं है लेकिन यदि आपके पास अन्य व्यक्ति इसे पढ़ रहे हैं तो आप उन्हें कोड को समझने में मदद करेंगे। – Luksprog