自定义ArrayAdapter AutoCompleteTextView不会触发

问题描述 投票:1回答:3

自定义ArrayAdapter AutoCompleteTextView没有触发我正在尝试使用自定义列表适配器的对象ArrayList使用AutoCompleteTextView,我无法显示自动完成列表。这是我的代码: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;}
    }

代码中没有错误,但是当我在customerACTV中输入字母时,它没有显示自动完成选择。调用CustomerListAdapter构造函数并传递Customer对象的ArrayList,但不调用CustomerListAdapter的getView。

谢谢

android-arrayadapter autocompletetextview
3个回答
1
投票

要使自动建议起作用,在自动完成文本视图中,我们必须覆盖getFilter(),我们在其中设置过滤器功能,默认适配器只能过滤字符串,并且您正在使用对象Customer

所以你需要在你身上做到以下几点:

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


    };

0
投票
public class CustomerListAdapter extends ArrayAdapter<Customer> {

ArrayList<Customer> customerList, suggestionList;


public CustomerListAdapter(Context context, int resource, int textViewResourceId, ArrayList<Customer> customerList) {
    super(context, resource, textViewResourceId, customerList);
    this.customerList = new ArrayList<>();
    this.customerList = customerList;

}

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

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

    View view = convertView;
    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.list_items, parent, false);
    }

    Customer customer = customerList.get(position);
    if(customer != null){
        TextView textView = view.findViewById(R.id.textView);
        if(textView != null)
            textView.setText(customer.getName());
    }
    return view;
}



@NonNull
@Override
public Filter getFilter() {
    return new Filter() {
        final Object object = new Object();

        @Override
        public String convertResultToString(Object resultValue) {
            Customer customer = (Customer) resultValue;
            return customer.getName();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {


            FilterResults filterResults = new FilterResults();
            suggestionList = new ArrayList<>();
            if (constraint != null) {
                for (Customer customer : customerList) {

                    if (customer.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
                        suggestionList.add(customer);
                    }
                    if (customerList.size() > 1) {
                        filterResults.values = suggestionList;
                        filterResults.count = suggestionList.size();
                    } else {
                        filterResults.values = null;
                        filterResults.count = 0;
                    }
                }
            }
            return filterResults;
        }

        @Override
        protected void publishResults (CharSequence constraint, FilterResults results){
            ArrayList<Customer> filterList = (ArrayList<Customer>)results.values;

            if (results != null && results.count > 0) {
                clear();
                for (Customer customer : filterList) {
                    add(customer);
                    notifyDataSetChanged();
                }
                notifyDataSetChanged();
            }
        }
    };
}

}


0
投票

公共类CustomerListAdapter扩展ArrayAdapter {

private ArrayList<Customer> customerList;
private ArrayList<Customer> filteredList;

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

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

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

    View view = convertView;
    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.list_items, parent, false);
    }

    Customer customer = filteredList.get(position);
    if(customer != null){
        TextView textView = view.findViewById(R.id.textView);
        if(textView != null)
            textView.setText(customer.getName());
    }
    return view;
}

@NonNull
@Override
public Filter getFilter() {
    return new Filter() {
        final Object object = new Object();

        @Override
        public String convertResultToString(Object resultValue) {
            Customer customer = (Customer) resultValue;
            return customer.getName();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();
            ArrayList<Customer> filters = new ArrayList<Customer>();
            if (constraint != null && constraint.length()>0) {
                for (Customer customer : customerList) {

                    if (customer.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
                        filters.add(customer);
                    }
                 }
                filterResults.values = filters;
                filterResults.count = filters.size();
                filteredList = filters;
            }
            return filterResults;
        }

        @Override
        protected void publishResults (CharSequence constraint, FilterResults results){
            ArrayList<Customer> filterList = (ArrayList<Customer>)results.values;

            if (results != null && results.count > 0) {
                clear();
                for (Customer customer : filterList) {
                    add(customer);
                    notifyDataSetChanged();
                }
                notifyDataSetChanged();
            }
        }
    };
}

}

© www.soinside.com 2019 - 2024. All rights reserved.