문제

Xamarin에서 AutoCompleteTextViewOr A MultiAutoCompleteTextViewWith 드롭 다운 목록을 가질 때 문자열 항목을 통해 중간에 나타나는 문자열 발생을 위해 검색을 수행 할 수 있습니까?

예를 들어 다음 문자열 배열이있는 경우 :

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

및 i AutoCompleteTextViewer a MultiAutoCompleteTextView에 "ITE"를 입력하면 위의 모든 항목이 표시됩니다.

내 질문은 다음 문자열 배열과 관련되어 있습니다.

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

ABCD "를 AutoCompleteTextViewer A MultiAutoCompleteTextView에 입력 할 수 있으며 다음이 표시됩니다.

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

도움이 되었습니까?

해결책

코드 크로스 플랫폼을 유지하려고 노력하므로 일반적으로 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 ());
    }
}
.

다른 팁

자신만의 어댑터를 만들고 직접 필터링해야합니다. 기본 어댑터는 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();
            }
        }
    }
}
.

  • 배열 이름 항목에서 제안 문자열을 사용합니다.취득 AutoCompleteTextView.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);  

}
}
.

이 예제를 확인하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top