2014-02-25 3 views
1

Xamarin에서 드롭 다운 목록이있는 또는 MultiAutoCompleteTextView이있는 경우 문자열 항목의 중간에 나타나는 문자열 발생을 검색 할 수 있습니까? 나는 다음과 같은 문자열 배열이있는 경우AutoCompleteTextView 드롭 다운 결과 표시

예를 들어, :

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

을 그리고 나는 AutoCompleteTextView 또는 MultiAutoCompleteTextView에 "ITE"를 입력, 모든 항목 위에 표시됩니다.

내 질문은 다음과 같은 문자열 배열의 관계에 있습니다

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

AutoCompleteTextView 또는 MultiAutoCompleteTextView에 "ABCD"를 입력 할 수 있으며, 다음이 표시됩니다

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

답변

0

나는 보통 ObservableCollection에 기반으로하는 어댑터를 사용할 수 있도록 호환 내 코드의 크로스 플랫폼을 유지하려고하고 안드로이드가 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

관련 문제