java - 自动完成编辑文本
问题描述
我有一个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();
}
解决方案
要使其工作,您需要创建一个 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());
}
});
推荐阅读
- appium - appium中的系统警报识别
- api - Json请求POST放心
- javascript - 谷歌电子表格空行后的所有行都未定义
- c# - Xamarin.Forms.GoogleMaps 无法在 IOS 上启动,UpdateIsShowingUser 中断
- arduino - 如何将域重定向到我在 ESP 上的公共 IPAddress?
- macos - 如何获取现有 MacOs 应用程序的功能列表
- numpy - 如何在内存中加载一个大的 h5 文件?
- python - 如果需要,我想在 python 中重复某个 if 语句
- html - 将多个掩码图像应用于单个 div
- javascript - Moment.js 增加两个星期而不改变时间