2010-11-17 18 views
5

मैं ListView के साथ MultiAutoCompleteTextView ड्रॉप डाउन सूची को प्रतिस्थापित करने का प्रयास कर रहा हूं, जिसमें ड्रॉप डाउन सूची के समान कार्यक्षमता होनी चाहिए, जिसका अर्थ है, जब मैं किसी एक आइटम में क्लिक करता हूं तो इसे जोड़ा जाना चाहिए MultiAutoCompleteTextView बॉक्स, ओ इतने पर, लेकिन जब आप टाइप करते हैं तो ListView को फ़िल्टर करना।MultAutoCompleteTextView ड्रॉप डाउन सूची को कैसे बदलें

तो मैं सफलता के बिना इस कच्चे कोड के साथ आया था:

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

}; 

मैं मुख्य समस्याओं के लिए है:

1) जब मैं किसी आइटम पर क्लिक करता हूं, तो संपूर्ण चयनित टेक्स्ट संलग्न होता है, मुझे पता है कि समस्या इस पर निर्भर करती है:

searchEdit.append (adapter.getItem (स्थिति));

लेकिन, मैं नियमित स्वत: पूर्ण की तरह टेक्स्ट फैलाने कैसे कर सकता हूं?

2) एक बार एक आइटम का चयन किया गया था, अगले इनपुट सुझाव किसी भी अधिक (SpaceTonekizer के बावजूद)

मुझे आशा है कि मेरी व्याख्या स्पष्ट था नहीं दिखाते।

अग्रिम धन्यवाद

उत्तर

6

किसी की तरह मैं जरूरत में कुछ करने की जरूरत है, मैं इस

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

एक्सएमएल इस तरह दिखता बनाया:

<?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> 

आशा इस मदद

+0

क्या आप मुझे ठीक बटन बता सकते हैं, जहां आप इसे डालते हैं? – pengwang

+1

क्षमा करें मैंने एक्सएमएल अपडेट नहीं किया है, एक्सएमएल जोड़ा गया है। – vsm

+0

मैं ListActivity बढ़ाता हूं, और इसके बजाय manager.getContacts() मैंने एक स्ट्रिंग का उपयोग किया [], लेकिन मुझे 12-07 14: 2 9: 56.459: त्रुटि/एंड्रॉइड रनटाइम (423): java.lang.RuntimeException: गतिविधि शुरू करने में असमर्थ ComponentInfo { com.test.testMultiAutoCompleteTextView/com.test.testMultiAutoCompleteTextView.testMultiAutoCompleteTextView}: java.lang.NullPointerException – pengwang

संबंधित मुद्दे