سؤال

في Xamarin، عندما يكون لدي AutoCompleteTextViewأو أ MultiAutoCompleteTextViewباستخدام القائمة المنسدلة، هل يمكن إجراء البحث عن تكرارات السلسلة التي تظهر في منتصف عنصر السلسلة؟

على سبيل المثال، إذا كان لدي مجموعة السلسلة التالية:

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

وأكتب "Ite" في الملف AutoCompleteTextViewأو أ MultiAutoCompleteTextView, ، سيتم عرض كافة العناصر المذكورة أعلاه.

سؤالي يتعلق بمصفوفة السلسلة التالية:

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

هل من الممكن كتابة "abcd" في ملف AutoCompleteTextViewأو أ 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();
            }
        }
    }
}
  • أخذ سلاسل الاقتراح في عنصر اسم الصفيف.أخذ مرجع expleteTextView التلقائي من ملف Auto_complete_string.xml.إضافة مجموعة عناصر إلى المحول وإضافة محول إلى 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