2011-10-27 34 views
17

Tôi đã theo gương này:thực hiện AutoComplete với ListView trong Android

http://developer.android.com/resources/tutorials/views/hello-autocomplete.html

Và tôi muốn biết làm thế nào tôi có thể thực hiện điều này với một ListView thay vì cửa sổ thả xuống được cung cấp với TextView này.

Ví dụ, khi người dùng nhập vào textView, có một ListView trực tiếp bên dưới textView sẽ thay đổi liên tục khi người dùng nhập vào trường textView.

EDIT: Đây là giải pháp mà tôi được mã hóa với nhờ Josephus:

package com.jaylefler.contacts; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 

public class ContactProjectActivity extends Activity { 
    /** Called when the activity is first created. */ 

    // List of all contacts 
    private ArrayList<String> searchNames = new ArrayList<String>(); 
    // Filtered list of contacts after user begins typing in search field 
    private ArrayList<String> partialNames = new ArrayList<String>(); 

    // List of names matching criteria are listed here 
    private ListView myList; 

    // Field where user enters his search criteria 
    private EditText nameCapture; 

    // Adapter for myList 
    private ArrayAdapter<String> adapter; 

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

     // Set list adapter 
     myList = (ListView) findViewById(R.id.names); 
     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, partialNames); 
     myList.setAdapter(adapter); 

     searchNames.add("Tom Arnold"); 
     searchNames.add("Zeb Arnold"); 
     searchNames.add("Dan Bateman"); 
     searchNames.add("Tommy Canders"); 
     searchNames.add("Elijah Arnman"); 
     searchNames.add("Tomas Muster"); 
     searchNames.add("Stefan Edberg"); 
     searchNames.add("Ivan Lendl"); 


     nameCapture = (EditText) findViewById(R.id.name); 
     nameCapture.setText("Tom"); 

     AlterAdapter(); 

     nameCapture.addTextChangedListener(new TextWatcher() { 

      // As the user types in the search field, the list is 
      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
       AlterAdapter(); 
      } 

      // Not used for this program 
      @Override 
      public void afterTextChanged(Editable arg0) { 

      } 

      // Not uses for this program 
      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
       // TODO Auto-generated method stub 

      } 
     }); 
    } 

    // Filters list of contacts based on user search criteria. If no information is filled in, contact list will be blank. 
    private void AlterAdapter() { 
     if (nameCapture.getText().toString().isEmpty()) { 
      partialNames.clear(); 
      adapter.notifyDataSetChanged(); 
     } 
     else { 
      partialNames.clear(); 
      for (int i = 0; i < searchNames.size(); i++) { 
       if (searchNames.get(i).toString().toUpperCase().contains(nameCapture.getText().toString().toUpperCase())) { 
        partialNames.add(searchNames.get(i).toString()); 
       } 
       adapter.notifyDataSetChanged(); 
      } 
     } 
    } 
} 
+0

Lọc mảng của bạn và hiển thị nó bằng cách làm mới nó. – doNotCheckMyBlog

+0

Ở đây chúng tôi gothis sẽ giúp: http://stackoverflow.com/questions/1645209/how-can-i-filter-listview-data-when-typing-on-edittext-in-android – doNotCheckMyBlog

+0

Điều này làm việc tuyệt vời. Cảm ơn bạn đã đăng giải pháp cuối cùng. – SilentNot

Trả lời

7
<yourEditText>.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
      <requery/filter your adapter then set it to your listview> 
      } 

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

      } 

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

      } 
     }); 
+0

Khi bạn nói "requery/filter" bộ điều hợp của tôi, tôi không hiểu những gì tôi cần làm. –

+1

sửa đổi mảng/con trỏ mà bạn đang cấp bộ điều hợp, sau đó gọi adapter.notifyDataSetChanged(). các thay đổi sẽ phản ánh trên listView của bạn. – josephus

+0

Liệu sự chậm trễ này trong việc tái tạo lại mảng có ngăn không cho "Tự động hoàn tất" xuất hiện ngay lập tức không? –

3

Khi lọc adapter bên trong phương pháp onTextChanged(), một cái gì đó bạn có thể làm thay lọc chính mình là:

adapter.getFilter().filter("search text"). 

Tôi đoán rằng cách tiếp cận của bạn có thể khá chậm với danh sách lớn.

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