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