首页 > 解决方案 > 自动完成编辑文本

问题描述

我有一个edittext 和一个recyclerview。我希望用户在edittext中输入字符“@”作为新单词的第一个字符时,recyclerview会在edittext上方弹出。如果用户在字符“@”之后继续键入,我们应该过滤 recyclerview 项目以匹配用户键入的任何内容到 recyclerview 中的项目。简而言之,一旦您输入字符“@”或在 Twitter 中,我想在 whatsapp 群聊中实现名称建议之类的功能。到目前为止,我已经能够显示 recyclerview,但前提是“@”是编辑文本中的第一个字符,但如果它在第二个单词中,例如 halo @w .. recyclerview 不会显示,请帮忙。如果用户退格“@”或删除它,我还需要隐藏recyclerview。第三,如何通过仅获取用户在字符“@”之后输入的文本来过滤显示的回收器视图。请帮忙,任何关于代码展示的帮助都会有很大帮助。这是我到目前为止所尝试的。

   InputFilter filter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence s, int start, int end, Spanned spanned, int i2, int i3) {

            if (s.toString().contains("@")){


                foods.setVisibility(View.VISIBLE); //foods is the recyclerview

                userMessageInput.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int i, int i1, int i2) {

                    }

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int i2) {
                        //to filter through the recyclerview to match with whatever user has typed after character "@"
                        if (!s.toString().contains(" ")){

                            List<FoodObject> mlist = new ArrayList<>();
                            for (FoodObject object: allfoodList){   //allfoodlist is food arraylist passed to food adapter
                                String name = object.getName().trim().toLowerCase();
                                if (name.contains(s.toString().toLowerCase())){
                                    mlist.add(object);
                                }
                                foodadapter.searchFood(mlist); //foodadapter is the rv adapter
                            }

                        } else {
                            foods.setVisibility(View.GONE); 
                        }

                    }

                    @Override
                    public void afterTextChanged(Editable editable) {

                    }
                });

            }
            else {
                Log.d("showit", "false");
            }
            return null;
        }
    };

    userInput.setFilters(new InputFilter[]{filter});  //userinput is the edittext field

//method in rv adapter to  search food
 public void searchFood(List<FoodObject> searchList){
    foodList = new ArrayList<>();
    foodList.addAll(searchList);
    notifyDataSetChanged();
}

标签: javaandroid

解决方案


要使其工作,您需要创建一个 Adapter 类。假设您有一个名为 User 的模型类;

public class TextUserAdapter extends ArrayAdapter<User> {
private List<User> users;

public TextUserAdapter(@NonNull Context context, @NonNull List<User> userList) {
    super(context, 0, userList);
    users = new ArrayList<>(userList);
}

@NonNull
@Override
public Filter getFilter() {
    return userFilter;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    if (convertView == null){
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.textview_adapter_user, parent, false);
    }

    TextView txtUsername = convertView.findViewById(R.id.txtUsername);

    User user = getItem(position);

    if (convertView != null){
        txtUsername.setText(user.getName() + " " + user.getSurname()));
    }

    return convertView;
}

private Filter userFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        FilterResults results = new FilterResults();
        List<User> suggestions = new ArrayList<>();

        if (charSequence == null || charSequence.length() == 0){
            suggestions.addAll(users);
        } else {
            String filterPattern = charSequence.toString().toLowerCase().trim();

            for (User user : users){
                if (user.getName().toLowerCase().contains(filterPattern)){
                    suggestions.add(user);
                }
            }
        }
        results.values = suggestions;
        results.count = suggestions.size();

        return results;
    }

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
        clear();
        addAll((List) filterResults.values);
        notifyDataSetChanged();
    }

    @Override
    public CharSequence convertResultToString(Object resultValue) {
        User user = (User) resultValue;
        return user.getName() + " " + user.getSurname();
    }
};

}

在您的活动或您的 autoCompleteTextView 所在的任何地方,您应该添加这些代码

autoCompleteTextView.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.toString().contains("@")){
                TextUserAdapter textUserAdapter = new TextUserAdapter(getApplicationContext(), Your user list);
                autoCompleteTextView.setAdapter(textUserAdapter);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

然后你应该在下面添加这个

    final ArrayList<User> userArrayList = new ArrayList<>();

    autoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            User user = (User) adapterView.getItemAtPosition(i);
            autoCompleteTextView.setText(autoCompleteTextView.getText().toString() + user.getName() + " " + user.getSurname());

        }
    });

推荐阅读