2012-10-16 31 views
13

đang hoạt động chính của tôi:AutoCompleteTextView không hiển thị danh sách thả xuống khi tôi nhấn không gian sau khi gõ một từ hoàn chỉnh

// here you put all your data. 
String[] dataArray = { "Amit sharma Kumar", "Hisham Kumar Munner", 
     "Vineet John Chaturvedi", "Lucky Kumar Verma" }; 

ArrayList<String> alAutoCompleteList; 
AutoCompleteTextView acTV; 
ArrayAdapter<String> adapter1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // etAuto = (EditText) findViewById(R.id.etAuto); 
    acTV = (AutoCompleteTextView) findViewById(R.id.acTV); 
    // Arraylist 
    alAutoCompleteList = new ArrayList<String>(); 
    adapter1 = new ArrayAdapter<String>(MainActivity.this, 
      android.R.layout.simple_dropdown_item_1line,  alAutoCompleteList); 


    acTV.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 
      if (acTV.enoughToFilter()) { 
       acTV.showDropDown(); 
       acTV.bringToFront(); 
      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 
      alAutoCompleteList.clear(); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

      String acText = acTV.getText().toString().trim(); 

      for (String item : dataArray) { 

       if  (item.toLowerCase().contains(acText.toLowerCase())) { 
        alAutoCompleteList.add(item); 
       } 
      } 


      acTV.setThreshold(4); 
      acTV.setAdapter(adapter1); 
      acTV.showDropDown(); 

     } 
    }); 

Khi tôi tìm kiếm cho "sharma" và nhấn một không gian sau đó những gợi ý đi tắt . Tôi muốn những lời đề nghị đó ở lại đó. Tôi đã cố gắng làm mọi thứ nhưng không thành công. Ai đó có thể giúp đỡ?

Chỉnh sửa: Ai đó có thể vui lòng thử mã này trên trình giả lập của họ không? Chỉ cần thêm AutoCompleteTextView vào xml và chạy nó.

Trả lời

14

Trước tiên, có lý do nào khiến bạn đặt trình xử lý TextWatcher trên AutoCompleteTextView không? Nếu bạn đã làm điều này để tự lọc dữ liệu thì bạn không nên làm điều đó (vì tiện ích này thực hiện điều này theo mặc định và mã của bạn không chính xác).

Khi tôi tìm kiếm "sharma" và nhấn một dấu cách sau đó. đề xuất được chuyển đi tắt. Tôi muốn những lời đề nghị đó ở lại đó.

này đang xảy ra vì adapter và mặc định Filter thực hiện mà đi kèm với nó, các yếu tố mà các AutoCompleteTextView sử dụng dưới mui xe để cung cấp các giá trị mà bạn thấy trong danh sách thả xuống. Hành vi mặc định cho số ArrayAdapter là hành vi bạn thấy, bạn có thể tìm thấy giải thích trong this answer. Giải pháp là triển khai bộ điều hợp riêng của bạn với bộ lọc sẽ tìm kiếm dữ liệu hàng của toàn bộ bộ chuyển đổi cho chuỗi bộ lọc. Tôi đã lấy mã của lớp ArrayAdapter từ SDK và thực hiện một điều chỉnh nhỏ để lọc không bị vỡ khi chèn dấu cách sau một từ. Bạn có thể tìm thấy lớp học here vì mã lớn để đăng. Chỉ cần sao chép các lớp học trong dự án của bạn và sử dụng nó như là một bình thường ArrayAdapter:

FilterWithSpaceAdapter<String> adapter1; 
//... 
adapter1 = new FilterWithSpaceAdapter<String>(MainActivity.this, 
      android.R.layout.simple_dropdown_item_1line, dataArray); 
+1

Giải pháp này không hiệu quả. Nếu bạn viết không gian trống, hãy bỏ qua các đề xuất thả xuống. – cnbandicoot

+0

@cnbandicoot Vui lòng đặt câu hỏi mới cung cấp thêm chi tiết về những gì bạn đang làm. – Luksprog

0

Tôi nghĩ rằng có vấn đề trong quan sát văn bản bởi vì quan điểm tự động hoàn thành văn bản không cần văn bản watcher vì rằng sự kiện tự động người nghe. bạn phải đơn giản vượt qua mảng của bạn vào bộ chuyển đổi thay vì danh sách. alAutoCompleteList không có bất kỳ giá trị nào trong danh sách. bạn chưa bao giờ thêm giá trị vào danh sách.

  • hoặc bạn phải làm như: alAutoCompleteList.add ("dữ liệu một"); alAutoCompleteList.add ("dữ liệu hai");

  • hoặc chuyển dữ liệuĐến bộ điều hợp. adapter1 = new ArrayAdapter (MainActivity.this, android.R.layout.simple_dropdown_item_1line, dataArray);

  • Không cần sử dụng trình theo dõi văn bản.

1

Bạn không cần Textwatcher, AutoCompleteTextView sử dụng Bộ lọc của Bộ điều hợp bạn đã đặt. Các bộ lọc bộ lọc mặc định các mục bằng cách gọi toString() trên chúng. Đương nhiên, nếu người dùng nhập vào một không gian, các giá trị không còn khớp. Để triển khai hành vi tùy chỉnh này, bạn không nên thêm trình chỉnh sửa văn bản nhưng tạo bộ điều hợp tùy chỉnh. Bạn vẫn có thể mở rộng ArrayAdapter hoặc SimpleAdapter. Bạn thực hiện hành vi lọc tùy chỉnh của mình (trong trường hợp của bạn là một cuộc gọi trim()) bằng cách ghi đè getFilter() và publishResults(). Here hoặc here bạn có thể tìm thấy các ví dụ về cách thực hiện điều đó.

2

Trước hết, bạn không cần TextWatcher với AutoCompleteTextViewAutoCompleteTextView có phương pháp riêng để xem văn bản tức là MyWatcher. Bạn cần sử dụng:

setThreshold(3); 
final String[] AndroidDesk= getResources().getStringArray(R.array.clothname_arrays); 
ArrayAdapter<String> My_arr_adapter= new ArrayAdapter<String>(getApplicationContext(), 
      android.R.layout.simple_dropdown_item_1line,AndroidDesk);  
    cloths.setThreshold(1); 
    cloths.setAdapter(My_arr_adapter); 
    cloths.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {        
    } 
    }); 
Các vấn đề liên quan