2010-11-17 23 views
5

Tôi đang cố gắng thay thế danh sách thả xuống MultiAutoCompleteTextView với ListView, nó sẽ có chức năng giống như danh sách thả xuống, có nghĩa là, khi tôi nhấp vào một trong các mục cần thêm vào Hộp MultiAutoCompleteTextView, v.v., nhưng lọc ListView khi bạn gõ.Làm thế nào để thay thế danh sách thả xuống MultiAutoCompleteTextView

Vì vậy, tôi đã đưa ra mã thô này nhưng không thành công:

filterable_listview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" android:layout_height="fill_parent" 
android:orientation="vertical"> 

<MultiAutoCompleteTextView 
    android:layout_height="wrap_content" android:layout_width="fill_parent" 
    android:hint="@string/To" android:id="@+id/search_box"></MultiAutoCompleteTextView> 

<ListView android:id="@android:id/list" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:layout_weight="1"/> 

</LinearLayout> 

AutoCompleteActivity.java

protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.filterable_listview); 
manager = new ContactManager(); 
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, manager.getContacts()); 

searchEdit = (MultiAutoCompleteTextView) findViewById(R.id.search_box); 

searchEdit.addTextChangedListener(filterTextWatcher); 

searchEdit.setTokenizer(new SpaceTokenizer()); 

setListAdapter(adapter); 

getListView().setOnItemClickListener(
    new ListView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, 
          int position, long id) { 
        //Here is one issues 
    searchEdit.append(adapter.getItem(position)); 
    } 
}); 
} 

private TextWatcher filterTextWatcher = new TextWatcher() { 
     public void afterTextChanged(Editable s) { 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count,int after) { 
     } 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      adapter.getFilter().filter(s); 
     } 

}; 

tôi phải vấn đề chính:

1) Khi tôi nhấp vào một mục, toàn bộ văn bản đã chọn được thêm vào, Tôi biết vấn đề dựa vào:

searchEdit.append (adapter.getItem (position));

nhưng, Làm cách nào để tạo văn bản mở rộng như tự động hoàn thành?

2) Khi một mục được chọn, đầu vào tiếp theo không hiển thị các gợi ý nữa (mặc dù SpaceTonekizer)

Tôi hy vọng lời giải thích của tôi rất rõ ràng.

Cảm ơn trước

Trả lời

6

Nếu ai đó cần phải làm một cái gì đó giống như tôi cần, tôi thực hiện điều này

private MultiAutoCompleteTextView searchEdit; 

private ArrayAdapter<String> adapter = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_dropdown_item_1line, manager 
        .getContacts()); 

    setListAdapter(adapter); 

    searchEdit = (MultiAutoCompleteTextView) findViewById(R.id.search_box); 

    searchEdit.addTextChangedListener(filterTextWatcher); 

    searchEdit.setTokenizer(new SpaceTokenizer()); 

    searchEdit.setAdapter(adapter); 

    searchEdit.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      String t = ((TextView) v).getText().toString(); 
      String f = searchEdit.getText().toString(); 

      int s = searchEdit.getSelectionStart(); 
      int i = s; 

      while (i > 0 && f.charAt(i - 1) != ' ') { 
       i--; 
      } 

      adapter.getFilter().filter(t.substring(i, s)); 
     } 
    }); 

    okButton = (Button) findViewById(R.id.ok); 
    okButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      Bundle stats = new Bundle(); 
      stats.putString("ConversationName", searchEdit.getText() 
        .toString()); 

      Intent i = new Intent(); 
      i.putExtras(stats); 
      setResult(RESULT_OK, i); 
      finish(); 
     } 
    }); 

    searchEdit.setOnKeyListener(new OnKeyListener() { 

     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT 
        || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT 
        || keyCode == KeyEvent.KEYCODE_DPAD_UP 
        || keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { 

       String t = ((TextView) v).getText().toString(); 
       String f = searchEdit.getText().toString(); 

       int s = searchEdit.getSelectionStart(); 
       int i = s; 

       while (i > 0 && f.charAt(i - 1) != ' ') { 
        i--; 
       } 

       adapter.getFilter().filter(t.substring(i, s)); 

       return false; 
      } 

      return false; 
     } 
    }); 

    getListView().setOnItemClickListener(
      new ListView.OnItemClickListener() { 
       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 

        String t = adapter.getItem(position); 
        String f = searchEdit.getText().toString(); 

        int s = searchEdit.getSelectionStart(); 
        int i = s; 

        while (i > 0 && f.charAt(i - 1) != ' ') { 
         i--; 
        } 

        searchEdit.getText().insert(s, t.substring(s - i)); 
       } 
      }); 
} 


    @Override 
protected void onDestroy() { 
    super.onDestroy(); 
    searchEdit.removeTextChangedListener(filterTextWatcher); 
} 


private TextWatcher filterTextWatcher = new TextWatcher() { 

    public void afterTextChanged(Editable s) { 
     okButton.setEnabled(searchEdit.getText().toString().trim() 
       .length() > 0); 
    } 

    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
    } 

    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     adapter.getFilter().filter(s); 
    } 

}; 



public class SpaceTokenizer implements Tokenizer { 

public int findTokenStart(CharSequence text, int cursor) { 
    int i = cursor; 

    while (i > 0 && text.charAt(i - 1) != ' ') { 
     i--; 
    } 
    while (i < cursor && text.charAt(i) == ' ') { 
     i++; 
    } 

    return i; 
} 

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; 
} 

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 + " "; 
     } 
    } 
} 
} 

Các xml trông như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" android:layout_height="fill_parent" 
android:orientation="vertical" 
android:drawingCacheQuality="high"> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" android:layout_height="wrap_content" 
android:orientation="horizontal"> 


    <MultiAutoCompleteTextView 
     android:layout_marginLeft="1dip" 
     android:layout_marginTop="1dip" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_width="fill_parent" 
     android:dropDownHeight="0px" 
     android:hint="@string/To" 
     android:id="@+id/search_box" 
     ></MultiAutoCompleteTextView> 



    <Button android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Ok" 
     android:id="@+id/ok" 
     android:enabled="false" 
     /> 


</LinearLayout>  
<ListView android:id="@android:id/list" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:layout_weight="1" /> 

</LinearLayout> 

Hope trợ giúp này

+0

bạn có thể cho tôi biết okButton, nơi bạn đặt nó? – pengwang

+1

xin lỗi tôi đã không cập nhật xml, kiểm tra xml thêm vào. – vsm

+0

tôi mở rộng ListActivity, và thay vì manager.getContacts() tôi đã sử dụng một chuỗi [], nhưng tôi nhận được 12-07 14: 29: 56.459: ERROR/AndroidRuntime (423): java.lang.RuntimeException: Không thể bắt đầu hoạt động ComponentInfo { com.test.testMultiAutoCompleteTextView/com.test.testMultiAutoCompleteTextView.testMultiAutoCompleteTextView.testMultiAutoCompleteTextView}: java.lang.NullPointerException – pengwang

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