2014-02-25 73 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

相关问题