首页 > 解决方案 > 按姓名搜索联系人列表

问题描述

我已经成功地在 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

    });
    ...
}

如果我应该添加任何其他信息以帮助每个人更好地理解问题,请告诉我。提前致谢。

标签: javaandroid

解决方案


首先,您需要创建原始列表的副本。仅仅因为如果添加和删除约束,您不想丢失对象:

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);

推荐阅读