安卓自动补全点击事件监听器

3

我创建了一个自定义的AutocompleteAdapter,我需要允许用户选择特定的对象(客户)。

我的AutoCompleteAdapter如下:

package nl.raakict.android.spc.Adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

import java.util.ArrayList;

import nl.raakict.android.spc.Fragment.ZoekenFragment;
import nl.raakict.android.spc.Model.Customer;
import nl.raakict.android.spc.Model.Supplier;
import nl.raakict.android.spc.R;

public class CustomerAutocompleteAdapter extends ArrayAdapter<Customer> implements Filterable{

     // Your sent context
    private Context context;
    // Your custom values for the spinner (User)
    private ArrayList<Customer> values;
    private ArrayList<Customer> originalValues;
    private ArrayFilter mFilter;
    private Customer selectedCustomer;
    private ZoekenFragment zoekenFragment;

    public CustomerAutocompleteAdapter(Context context, int textViewResourceId,
                                       ArrayList<Customer> values) {
        super(context, textViewResourceId, values);
        this.context = context;
        this.values = new ArrayList<Customer>(values);
        this.originalValues = new ArrayList<Customer>(values);
    }

    public Customer getSelectedCustomer() {
        return selectedCustomer;
    }

    public int getCount(){
        return values.size();
     }

     public Customer getItem(int position){
        return values.get(position);
     }

     public long getItemId(int position){
        return position;
     }

     public View getView(int position, View convertView, ViewGroup parent) {
         View view = convertView;
         if (view == null) {
             LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             view = inflater.inflate(R.layout.simple_spinner_item, null);
         }

         Customer item = getItem(position);
         if (item!= null) {
             // My layout has only one TextView
             TextView itemView = (TextView) view;
             if (itemView != null) {
                 // do whatever you want with your string and long
                 itemView.setText(item.toString());
             }
             view.setTag(item);
             view.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View view) {
                     selectedCustomer = (Customer)view.getTag();
                     zoekenFragment.startSearch(selectedCustomer);
                 }
             });
          }

         return view;
     }

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

         View view = convertView;
         if (view == null) {
             LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             view = inflater.inflate(R.layout.simple_spinner_item, null);
         }
         view.setTag(values.get(position));
         // My layout has only one TextView
         TextView label = (TextView) view;
         label.setText(values.get(position).getName());
         return label;
     }

     @Override
     public Filter getFilter() {
         if (mFilter == null) {
             mFilter = new ArrayFilter();
         }
         return mFilter;
     }

    public void setSelectedListener(ZoekenFragment zoekenFragment) {
        this.zoekenFragment = zoekenFragment;
    }


    private class ArrayFilter extends Filter {
         private Object lock;

         @Override
         protected FilterResults performFiltering(CharSequence prefix) {
             FilterResults results = new FilterResults();

             if (originalValues == null) {
                 synchronized (lock) {
                     originalValues =new ArrayList<Customer>(values);
                 }
             }

             if (prefix == null || prefix.length() == 0) {
                 synchronized (lock) {
                     ArrayList<Customer> list = new ArrayList<Customer>(originalValues);
                     results.values = list;
                     results.count = list.size();
                 }
             } else {
                 final String prefixString = prefix.toString().toLowerCase();

                 ArrayList<Customer> values = originalValues;
                 int count = values.size();

                 ArrayList<Customer> newValues = new ArrayList<Customer>(count);

                 for (int i = 0; i < count; i++) {
                     Customer item = values.get(i);
                     if (item.getName().toLowerCase().contains(prefixString.toLowerCase())) {
                         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){
             values = (ArrayList<Customer>) results.values;
         }else{
             values = new ArrayList<Customer>();
         }
             if (results.count > 0) {
                 notifyDataSetChanged();
             } else {
                 notifyDataSetInvalidated();
             }
         }
     }


}

这段代码有效,选择客户名称会自动触发OnClickListener。但问题是现在下拉列表(Spinner)不会关闭,也不会自动完成名称。我想要的是,要么触发原始的onClick,要么执行与原始的onClick相同的操作。
这里是我需要的onClick方法:
view.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View view) {
                     selectedCustomer = (Customer)view.getTag();
                     zoekenFragment.startSearch(selectedCustomer);
                 }
             });

编辑

这也没有任何积极的结果:

private void initiateCustomerAutocomplete() {
    customerAutocomplete = (AutoCompleteTextView) getView().findViewById(
            R.id.autocomplete_klantnaam);
    customerAdapter = new CustomerAutocompleteAdapter(getView()
            .getContext(), android.R.layout.simple_spinner_item,
            customers
    );
    customerAutocomplete.addTextChangedListener(this);
    customerAutocomplete.setAdapter(customerAdapter);
    customerAutocomplete.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            Customer selectedCustomer = (Customer)view.getTag();
            startSearch(selectedCustomer);
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });
    customerAutocomplete.setThreshold(1);
    customerAdapter.setSelectedListener(this);
}
1个回答

0
所以我找到了解决方案。我查看了AutoCompleteTextView类中的方法,并找到了dismissDropDown()方法。接下来,我将我的CustomAutoCompleteTextView传递给适配器,并将onClick监听器更改为:
         view.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 selectedCustomer = (Customer) view.getTag();
                 zoekenFragment.startSearch(selectedCustomer);
                 customerAutocomplete.setText(selectedCustomer.getName());
                 customerAutocomplete.dismissDropDown();
             }
         });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接