java - 按姓名搜索联系人列表
问题描述
我已经成功地在 arrayList 中检索了用户的电话联系人并将其上传到我的应用程序,在那里我还能够区分安装了我的应用程序的联系人(用户)和尚未安装的联系人。我一直在尝试实现搜索功能,用户可以按姓名搜索联系人,但我没有得到任何结果。
任何人都可以就如何去做吗?
另外,我想对联系人的arrayList进行排序,以便安装了应用程序的人出现在recyclerview的顶部,按字母顺序排列,没有安装的人出现在最后一个应用程序用户之后,也按字母顺序排列? 整个联系人列表已经按字母顺序排列,现在使用 Collections.sort(); 这是我到目前为止所尝试的。
ArrayList<UserObject> userList, contactList;
List<UserObject> filteredList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_contacts);
//adding the filteredList
contactList = new ArrayList<>();
userList = new ArrayList<>();
filteredList = new ArrayList<>();
mUserList = (RecyclerView) findViewById(R.id.userList); //recyclerview
mUserList.setNestedScrollingEnabled(false);
mUserList.smoothScrollToPosition(0);
mUserList.setHasFixedSize(true);
mUserListLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayout.VERTICAL, false);
mUserList.setLayoutManager(mUserListLayoutManager);
mUserListAdapter = new UserListAdapter(userList, filteredList);
mUserListAdapter.setHasStableIds(true);
mUserList.setAdapter(mUserListAdapter);
search = findViewById(R.id.searchh); //search is an Edittext
search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
filteredList.clear();
String name = search.getText().toString();
for (UserObject userObject : userList){
if (userObject.getName().contains(name)){
filteredList.add(userObject);
}
}
mUserListAdapter.notifyDataSetChanged();
}
@Override
public void afterTextChanged(Editable editable) {
}
});
...
}
//我的用户列表适配器
public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<UserObject> userList;
List<UserObject> filteredList; //the filteredList
private Context context;
private static final int TYPE_ONE = 1;
private static final int TYPE_TWO = 2;
public UserListAdapter(ArrayList<UserObject> userList, List<UserObject> filteredList){
this.userList = userList;
this.filteredList = filteredList;
}
//some more code
//BindViewHolder
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
switch (holder.getItemViewType()){
case TYPE_ONE:
initLayoutOne((ViewHolderOne) holder, position);
break;
case TYPE_TWO:
initLayoutTwo((ViewHolderTwo) holder, position);
break;
default:
break;
}
}
//case one
private void initLayoutOne(final ViewHolderOne holder, final int position) {
holder.mName.setText(userList.get(position).getName());
holder.mPhone.setText(userList.get(position).getPhone());
//more code
});
...
}
如果我应该添加任何其他信息以帮助每个人更好地理解问题,请告诉我。提前致谢。
解决方案
首先,您需要创建原始列表的副本。仅仅因为如果添加和删除约束,您不想丢失对象:
List<UserObject> filteredList = new ArrayList();
然后在 RecyclerView(或 ListView)中显示此列表:
adapter.setItems(filteredList)
然后在 textWatcher 中过滤原始列表并将相应的项目添加到过滤列表中,然后调用 adapter.notifyDataSetChanged():
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String name = search.getText().toString();
filteredList.clear();
for (UserObject userObject : userList){
if (userObject.getName().contains(name)){
filteredList.add(userObject);
}
}
adapter.notifyDataSetChanged(); //Do not forget this line
}
- - - - -编辑 - - - - -
1-从适配器中删除过滤列表。没必要。
2-在您的活动中初始化您的适配器,如下所示:
mUserListAdapter = new UserListAdapter(filteredList);
推荐阅读
- appium - 在appium ios中滑动到dom中不存在的元素
- python - 最小最大边权树
- html - 如何使固定标题宽度为 100%
- python - 如何让驱动程序等待长达 10 秒点击超链接
- html - 如何在媒体查询中隐藏 HTML 元素?
- vba - excel vba替换对话框(ctrl+h)换行
- php - 如何在 /blog 上拥有一个 Apache 服务的 Flask 网站和一个 WordPress 博客?
- bash - 为什么“bash -c”中的命令替换中的变量不可见?
- java - 使用代码将图片从图库移动到可绘制对象。[安卓工作室]
- angular - 通过不同的端口登录Angular Spring