Pregunta

En Xamarin, cuando tengo un AutoCompleteTextViewo un MultiAutoCompleteTextViewcon una lista desplegable, puede que la búsqueda debe hacerse para la cadena de sucesos que aparecen a mitad de camino a través de la cadena de elemento?

Por ejemplo, si tengo la siguiente matriz de cadena:

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

Y yo tipo "Ite" en la AutoCompleteTextViewo un MultiAutoCompleteTextView, todos los elementos por encima de la voluntad de la pantalla.

Mi pregunta es en relación a la cadena siguiente matriz:

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

Es posible que el tipo de "abcd" en la AutoCompleteTextViewo un MultiAutoCompleteTextView, y se mostrará lo siguiente:

"1abcd", "2abdc", "Item42abcd"
¿Fue útil?

Solución

Yo trato de mantener mi código de la cruz-plataforma compatible así que por lo general el uso de un adaptador basado en ObservableCollection y en Android se implementa tanto IListAdapter y ISpinnerAdapter.Esto es para evitar problemas de rendimiento con grandes conjuntos de datos.Aquí es un poco de código de demostración para la funcionalidad básica sólo por el uso de EditText y un básico de 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 ());
    }
}

Otros consejos

Usted tendrá que crear su propio Adaptador y filtro, por defecto adaptador funciona con startsWith, usted tiene que cambiar contains.

El ejemplo completo aquí.

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();
            }
        }
    }
}
  • Tomando la sugerencia de cadenas de caracteres en un nombre de matriz de punto.Tomando AutoCompleteTextView de referencia de auto_complete_string.xml archivo.Añadir elemento de la matriz de adaptador y agregar adaptador para AutoCompleteTextView.

La aplicación

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);  

}
}

Echa un vistazo a este Ejemplo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top