Search code examples
android-arrayadapterautocompletetextview

Custom ArrayAdapter AutoCompleteTextView not triggering


Custom ArrayAdapter AutoCompleteTextView not triggering I’m trying to use a AutoCompleteTextView with a ArrayList of objects using a custom list adapter and I cannot get the auto complete list to display. Here is my code: activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="rick.customarrayadpter.MainActivity">

        <AutoCompleteTextView
            android:id="@+id/customerACTV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="search" />
    </android.support.constraint.ConstraintLayout>

MainActivity.java
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.AutoCompleteTextView;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity {
        private ArrayList<Customer> customerList;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            customerList = new ArrayList<Customer>();
            customerList.add(new Customer(111, "Pete"));
            customerList.add(new Customer(222, "Bob"));
            customerList.add(new Customer(333, "Paul"));
            customerList.add(new Customer(444, "Tom"));
            customerList.add(new Customer(555, "Jane"));
            customerList.add(new Customer(666, "Susan"));

            CustomerListAdapter customerListAdapter = new CustomerListAdapter(this, R.layout.support_simple_spinner_dropdown_item, R.id.customerACTV, customerList);
            AutoCompleteTextView customerACTV = (AutoCompleteTextView)findViewById(R.id.customerACTV);
            customerACTV.setThreshold(1);
            customerACTV.setAdapter(customerListAdapter);

        }

    }

CustomerListAdapter.java
    public class CustomerListAdapter extends ArrayAdapter<Customer> {

            ArrayList<Customer> customerList = new ArrayList<>();

            public CustomerListAdapter(Context context, int resource,int textViewResourceId,  ArrayList<Customer> objects) {
                super(context, resource, textViewResourceId, objects);
                customerList = objects;
            }

            @Override
            public int getCount() {
                return super.getCount();
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                View v = convertView;
                LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = inflater.inflate(R.layout.list_items, null);
                AutoCompleteTextView textView = (AutoCompleteTextView) v.findViewById(R.id.customerACTV);
                textView.setText(customerList.get(position).getName());
                return v;

            }
        }

list_items.xml
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"

            android:text="Demo"
            android:textColor="#000" />


    </android.support.constraint.ConstraintLayout>

    Customer.java
    public class Customer {
        String name;
        int id;
        public Customer(int ID, String Name){
            this.id = ID;
            this.name = Name;
        }

        public String getName(){return this.name;}
        public int getId(){return this.id;}
    }

There is no errors in the code but it does not show the auto complete selection when I enter letters in the customerACTV. The CustomerListAdapter constructor is getting called and the ArrayList of the Customer objects is getting passed but the getView of the CustomerListAdapter is not getting called.

Thanks


Solution

  • For auto suggestions to work, in autocomplete textview, we have to over-ride getFilter(), where we set the filter functionality, the default adapter can only filter strings, and you are using an object Customer

    So you need to do the following in you :

    @NonNull
    @Override
    public Filter getFilter() {
    
        return new Filter() {
            final Object object = new Object();
    
            @Override
            public String convertResultToString(Object resultValue) {
             return resultValue.toString();
    
            }
    
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
    
    
    
    
                FilterResults filterResults = new FilterResults();
                List<Customer> customers = new ArrayList<>();
    
                if (constraint != null) {
    
                    for (Customer customer : customerList) {
                        if (department instanceof SearchableStrings) {
                            if (customer.getname().toLowerCase().contains(constraint.toString().toLowerCase())) {
                                customers.add(customer);
    
                            }
    
                        } 
                        if (customers.size() > 1) {
                            filterResults.values = customers;
                            filterResults.count =      customers.size();
                        } else {
                            filterResults.values = null;
                            filterResults.count = 0;
    
    
                    }
    
    
    
                }
                //notifyDataSetChanged();
                return filterResults;
            }
    
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
    
                // mObjects.clear();
                if (results != null && results.count > 0) {
                   clear();
                    // avoids unchecked cast warning when using customerList.addAll((ArrayList<Customer>) results.values);
                    for (Object object : (List<?>) results.values) {
                        add(object);
    
    
                    }
                    notifyDataSetChanged();
                }
            }
    
    
        };