【问题标题】:Can't get the value on the onItemClick of AutoCompleteTextView custom adapter无法获取 AutoCompleteTextView 自定义适配器的 onItemClick 上的值
【发布时间】:2018-02-19 12:15:08
【问题描述】:

我正在创建一个具有autocompletextview 的应用,用户在输入时会看到建议,就像一个组合框一样。

我需要完成什么。

  • 为 AutoCompleteTextView 创建一个自定义适配器。 (已完成)
  • 当我输入文本时,会出现建议列表。 (已完成)
  • 当我点击该建议时,我将能够获得与列出的其他信息相同的当前名称。

现在我无法获取所点击项目的当前信息(其 ID、姓名、电话号码、电子邮件)。发生的情况是,当我单击一个项目时,显示了第一个项目的当前数据。

这是我的 getter 和 setter:

public class Contacts {

    private String id;
    private String name;
    private String email;
    private String number;

    public Contacts() {
    }

    public Contacts(String id, String name, String email, String number) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.number = number;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}

这是我的带有过滤器的自定义适配器:

public class AutoCompleteTextViewAdapter extends ArrayAdapter<Contacts> {

        private List<Contacts> contacts = new ArrayList<Contacts>();
        private List<Contacts> filteredContacts = new ArrayList<Contacts>();

        public AutoCompleteTextViewAdapter(Context context, List<Contacts> contacts) {

            super(context, 0, contacts);
            this.contacts = contacts;

        }

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

        @NonNull
        @Override
        public Filter getFilter() {
            return new ContactsFilter(this, contacts);
        }



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

            Contacts contacts = filteredContacts.get(position);
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.inflater_search_contacts_spinner, parent, false);
            TextView nameTV = convertView.findViewById(R.id.phoneNameTV);
            TextView numberTV = convertView.findViewById(R.id.phoneNumberTV);
            nameTV.setText(contacts.getName());
            numberTV.setText(contacts.getNumber());

            return convertView;

        }

        private class ContactsFilter extends Filter {

            AutoCompleteTextViewAdapter adapter;
            List<Contacts> originalList;
            List<Contacts> filteredList;

            public ContactsFilter(AutoCompleteTextViewAdapter adapter, List<Contacts> originalList) {

                super();
                this.adapter = adapter;
                this.originalList = originalList;
                this.filteredList = new ArrayList<>();

            }

            protected FilterResults performFiltering(CharSequence constraint) {

                filteredList.clear();
                final FilterResults results = new FilterResults();
                if (constraint == null || constraint.length() == 0) {
                    filteredList.addAll(originalList);
                } else {
                    final String filterPattern = constraint.toString().toLowerCase().trim();
                    for (final Contacts contacts : originalList) {

                        if(contacts.getName().toLowerCase().contains(filterPattern)) {
                            filteredList.add(contacts);
                        }

                    }
                }

                results.values = filteredList;
                results.count = filteredList.size();
                return results;

            }

            protected void publishResults(CharSequence constraint,FilterResults results) {

                adapter.filteredContacts.clear();
                adapter.filteredContacts.addAll((List) results.values);
                adapter.notifyDataSetChanged();

            }

        }
    }

这是我的 oncreate 方法中的代码:

searchContactsET = findViewById(R.id.searchContactsET); //autocompletextview
searchContactsET.setThreshold(1);
searchContactsET.setAdapter(new AutoCompleteTextViewAdapter(getApplicationContext(), getAllContacts()));
searchContactsET.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Contacts contacts = (Contacts) adapterView.getItemAtPosition(i);
        searchContactsET.setText(contacts.getName());
        Log.i("CONTACTS: ", contacts.getName());
    }
});

我的列表与我的 oncreate 方法在同一类下。

public List<Contacts> getAllContacts() {
    List<Contacts> contacts = new ArrayList<Contacts>();
    contacts.add(new Contacts("PO90", "ERIKA", "erikasong1925@gmail.com", "09324612629"));
    contacts.add(new Contacts("PO95", "JULIEZETTE", "juliesong1925@gmail.com", "09284612629"));
    return contacts;
}

【问题讨论】:

    标签: android android-arrayadapter autocompletetextview


    【解决方案1】:

    可能的替代方法是将 ArrayList 也存储在您的 Activity 中。 从 itemselected Position 中取出 Arraylist 的成员。

    您可以在您的活动片段中声明列出联系人。 修改getContact方法如下

    public List<Contacts> getAllContacts() {
        contacts = new ArrayList<Contacts>();
        contacts.add(new Contacts("PO90", "ERIKA", "erikasong1925@gmail.com", "09324612629"));
        contacts.add(new Contacts("PO95", "JULIEZETTE", "juliesong1925@gmail.com", "09284612629"));
        return contacts;
    }
    

    使用以下代码修改项目选择方法

    searchContactsET = findViewById(R.id.searchContactsET); //autocompletextview
    searchContactsET.setThreshold(1);
    searchContactsET.setAdapter(new AutoCompleteTextViewAdapter(getApplicationContext(), getAllContacts()));
    searchContactsET.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Contacts contact = contacts.get(i);
            searchContactsET.setText(contacts.getName());
            Log.i("CONTACTS: ", contacts.getName());
        }
    });
    

    我认为这将解决您的问题。

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2013-10-07
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多