Đây là câu hỏi tiếp theo của tôi ở đây: Android: Autocomplete TextView Similar To The Facebook App.MultiAutoCompleteTextView với Bộ điều hợp tùy chỉnh hiển thị chuỗi bị cắt xén
Bối cảnh:
Yêu cầu của tôi trong câu hỏi (liên kết được đăng trên) đã có một AutoCompleteTextView
tương tự như sử dụng trong các ứng dụng Facebook và một số người khác quá. Giải pháp là sử dụng nhiều dòng MultiAutoCompleteTextView
Ý tưởng là cho phép người dùng nhập trực tiếp tên Bạn bè của họ trong khi tạo Cập nhật trạng thái. Giải pháp trong câu trả lời hoạt động tốt từ một quan điểm độc lập. Tuy nhiên, khi tôi nhìn chằm chằm tích hợp giải pháp trong mã hiện có của mình, nó vẫn hoạt động với đúng trình đơn thả xuống và tất cả. Tôi thấy danh sách lọc bạn bè của tôi nhờ giải pháp từ đây: https://stackoverflow.com/a/12363961/1350013. Tôi sử dụng tùy chỉnh ListView
với số BaseAdapter
thay vì số GridView
từ giải pháp.
Vấn đề:
Mã của tôi làm cho việc sử dụng một BaseAdapter
mà thực hiện Filterable
. Như đã đề cập ở trên, hoạt động tốt.
Khi tôi chọn một người bạn từ danh sách được lọc, là nơi xảy ra sự cố. Các MultiAutoCompleteTextView
, sau khi lựa chọn, hiển thị này: @[email protected]
thay vì tên của bạn bè. Tôi phải thay đổi gì để hiển thị Tên thay vì văn bản bị cắt xén? Nếu điều đó giúp ích, Lớp I chạy này sẽ mở rộng một số SherlockActivity
và không phải là SherlockListActivity
.
Bây giờ tôi không chắc chắn mã có liên quan sẽ là gì để tìm ra vấn đề có thể nằm ở đâu, vì vậy tôi sẽ đăng càng nhiều mã có liên quan càng tốt. Tôi là một noob, vì vậy hãy dễ dàng và yêu cầu thêm bất kỳ mã nào. Tôi sẽ nhanh chóng tuân thủ. Tương tự như vậy, nếu một cái gì đó ở đây là không cần thiết là lộn xộn bài, tôi sẽ loại bỏ điều đó.
khối mã
Các Tokenizer từ dung dịch từ câu hỏi trước đây của tôi. Liên kết ở phía trên (Trong phương pháp 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;
}
});
Các TextWatcher, cũng từ các giải pháp cho câu hỏi trước đó:
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) {
}
};
Đối với ArrayList của tôi:
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;
}
}
Tôi chưa xem qua mã của câu hỏi khác nhưng có vẻ như phương thức 'toString' đang được gọi cho lớp' getFriends' của bạn (đặt tên khủng khiếp bằng cách này).Hãy thử thêm một phương thức 'toString' được ghi đè vào lớp' getFriends', giống như sau: '@Override public String toString() {return friendName;}' và xem điều gì xảy ra. – Luksprog
Đầu tiên. Giải pháp trong bình luận đã hoạt động ngay lập tức. Vì vậy, xin vui lòng thêm này như là một câu trả lời và tôi sẽ chấp nhận nó (với các bounty thiết lập) :-). Thứ hai. Điều gì sẽ là một cách tốt hơn để đặt tên cho lớp học? Khi bạn nói khủng khiếp, liệu nó có gây ra bất kỳ mối lo ngại nào cho ứng dụng bị hỏng hóc không? Hoặc là nó chỉ là thực hành đặt tên xấu? –
Tôi đã phóng đại bằng cách sử dụng "khủng khiếp", không có vấn đề với các ứng dụng hoạt động đúng nó chỉ là bạn nên sử dụng các quy ước java (chữ hoa cho tên lớp). Ngoài ra, có thể 'getFriends' không phải là một lựa chọn tốt, ví dụ như khi tôi đọc câu hỏi đầu tiên của bạn' getFriends' có vẻ giống như một tên phương thức và không phải là một lớp. Vì lớp của bạn là một người giữ dữ liệu, một tên như 'FriendData' hoặc' FriendInformation' có thể là một cái tên biểu cảm hơn đối với người đọc mã của bạn. Đây không phải là điều quan trọng nhưng nếu bạn có người khác đọc nó, bạn sẽ giúp họ hiểu mã. – Luksprog