2012-10-10 26 views
6

Đâ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; 
    } 
} 
+0

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

+0

Đầ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? –

+1

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

Trả lời

6

Đánh giá bởi đầu ra bạn nhận được nó xuất hiện rằng mã của bạn gọi phương thức toString trên các đối tượng getClass của bạn để truy xuất dữ liệu cần thiết. Như bạn muốn tên của người bạn đó bạn nên thực hiện phương pháp toString riêng của bạn (bằng cách ghi đè nó) như thế này:

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

Đây không phải là cách nó nên được thực hiện (và tôi thậm chí sẽ nói rằng nó là sai), có những phương pháp được chỉ định cho chuyển đổi này. Bạn không nên dựa vào phương thức toString của hàm. – Heinrisch

14

Bạn nên ghi đè convertResultToString(Object resultValue) trong bộ lọc của bạn, nơi Object là lớp học của bạn. Điều này làm cho nó có thể tạo một chuỗi tùy chỉnh cho bạn lớp mà không dựa vào việc ghi đè phương thức String.

+2

đây phải là câu trả lời được chấp nhận. Nó hoạt động tốt hơn với quốc tế hóa khi bạn không cần phải có được bối cảnh ứng dụng trong đối tượng mô hình của bạn. – alaeri

Các vấn đề liên quan