2014-02-25 69 views
1

在Xamarin中,當我有一個AutoCompleteTextViewMultiAutoCompleteTextView帶有下拉列表時,是否可以搜索出現在字符串項目中間的字符串出現?顯示AutoCompleteTextView下拉結果

例如,如果我有以下字符串數組:

String[] countries = new string[] { "Item1", "Item2", "Item3", "Item4", "Item5" }; 

和I型「ITE」進入AutoCompleteTextViewMultiAutoCompleteTextView,所有上述項目將顯示出來。

我的問題是關於以下字符串數組:

String[] countries = new string[] { "1abcd", "2abdc", "1234", "Item42abcd", "Item5" }; 

是否可以輸入「ABCD」爲AutoCompleteTextViewMultiAutoCompleteTextView了,下面會顯示:

"1abcd", "2abdc", "Item42abcd" 

回答

0

我儘量保持我的代碼跨平臺兼容,所以我通常使用基於的ObservableCollection適配器和Android中它同時實現了IListAdapter和ISpinnerAdapter。這是爲了避免大數據集的性能問題。這裏是一個基本功能的小演示代碼,只需使用EditText和一個基本的ArrayAdapter:

[Activity (Label = "SearchBox", MainLauncher = true)] 
public class MainActivity : Activity 
{ 
    private readonly string[] countries = { "1abcd", "2abdc", "1234", "Item42abcd", "Item5" }; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate (bundle); 

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 

     var editText = this.FindViewById<EditText> (Resource.Id.editText1); 
     var listView = this.FindViewById<ListView> (Resource.Id.listView1); 

     listView.Adapter = new ArrayAdapter (this, Resource.Layout.ListItem, countries); 

     editText.TextChanged += (sender, e) => listView.Adapter = 
      new ArrayAdapter (
       this, 
       Resource.Layout.ListItem, 
       countries.Where (a => a.Contains (editText.Text)).ToArray()); 
    } 
} 
0

您必須創建自己的適配器並過濾自己,默認情況下,適配器適用於startsWith,您必須將其更改爲contains

完整的例子在這裏。

public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { 

    private ArrayList<String> fullList; 
    private ArrayList<String> mOriginalValues; 
    private ArrayFilter mFilter; 
    private MainActivity mActivity; 

    public AutoCompleteAdapter(MainActivity activity, int resource, List<String> objects) { 

     super(activity, resource, objects); 
     fullList = (ArrayList<String>) objects; 
     mOriginalValues = new ArrayList<String>(fullList); 
     mActivity = activity; 

    } 

    @Override 
    public int getCount() { 
     return fullList.size(); 
    } 

    @Override 
    public String getItem(int position) { 
     return fullList.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return super.getView(position, convertView, parent); 
    } 

    @Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new ArrayFilter(); 
     } 
     return mFilter; 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     TextView v = (TextView) super.getView(position, convertView, parent); 

     if (v == null) { 
      v = new TextView(mActivity); 
     } 
     v.setText(fullList.get(position)); 
     v.setTextColor(mActivity.getResources().getColor(R.color.textColor)); 
     v.setTextSize(mActivity.getResources().getDimension(R.dimen.my_orders_spinner_text_size)); 
     v.setPadding(
       (int)mActivity.getResources().getDimension(R.dimen.my_orders_spinner_text_padding), 
       (int)mActivity.getResources().getDimension(R.dimen.my_orders_spinner_text_padding), 
       (int)mActivity.getResources().getDimension(R.dimen.my_orders_spinner_text_padding), 
       (int)mActivity.getResources().getDimension(R.dimen.my_orders_spinner_text_padding)); 
     return v; 
    } 


    private class ArrayFilter extends Filter { 
     private Object lock; 

     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      FilterResults results = new FilterResults(); 

      if (mOriginalValues == null) { 
       synchronized (lock) { 
        mOriginalValues = new ArrayList<String>(fullList); 
       } 
      } 

      if (prefix == null || prefix.length() == 0) { 
       synchronized (lock) { 
        ArrayList<String> list = new ArrayList<String>(mOriginalValues); 
        results.values = list; 
        results.count = list.size(); 
       } 
      } else { 
       final String prefixString = prefix.toString().toLowerCase(); 

       ArrayList<String> values = mOriginalValues; 
       int count = values.size(); 

       ArrayList<String> newValues = new ArrayList<String>(count); 

       for (int i = 0; i < count; i++) { 
        String item = values.get(i); 
        if (item.toLowerCase().contains(prefixString)) { 
         newValues.add(item); 
        } 

       } 

       results.values = newValues; 
       results.count = newValues.size(); 
      } 

      return results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

      if(results.values!=null){ 
       fullList = (ArrayList<String>) results.values; 
      }else{ 
       fullList = new ArrayList<String>(); 
      } 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
} 
0
  • 以建議字符串數組中的名稱的項目。從auto_complete_string.xml文件取得 AutoCompleteTextView引用。 將項目數組添加到適配器並將適配器添加到AutoCompleteTextView。

實施

public class AutoCompleteString extends Activity implements OnItemClickListener, 
OnItemSelectedListener { 

// Initialize variables 

AutoCompleteTextView textView=null; 
private ArrayAdapter<String> adapter; 

//These values show in autocomplete 
String item[]={ 
      "January", "February", "March", "April", 
      "May", "June", "July", "August", 
      "September", "October", "November", "December" 
     }; 

@Override 
public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 

    setContentView(R.layout.auto_complete_string); 


    // Initialize AutoCompleteTextView values 

     // Get AutoCompleteTextView reference from xml 
     textView = (AutoCompleteTextView) findViewById(R.id.Months); 

     //Create adapter  
     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, item); 

     textView.setThreshold(1); 

     //Set adapter to AutoCompleteTextView 
     textView.setAdapter(adapter); 

} 
} 

Check out this Example

相關問題