عرض نتائج القائمة المنسدلة AutoCompleteTextView
-
21-12-2019 - |
سؤال
في 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);
}
}