【问题标题】:Searching Contacts List by Name按姓名搜索联系人列表
【发布时间】:2019-07-15 12:37:22
【问题描述】:

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

    });
    ...
}

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

【问题讨论】:

  • 请先说你的问题是什么?请说明您是否可以使用 Kotlin?
  • 您好 Saeed,我想搜索 userList,这是一个包含所有用户电话联系人的 arrayList。我该怎么办?如果您用 Java 提供解决方案,我将不胜感激,因为我对 Kotlin 并不那么精通。你还想让我在代码部分添加什么吗?提前致谢

标签: java android


【解决方案1】:

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

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

【讨论】:

  • 非常感谢赛义德。您的解决方案看起来是问题的理想解决方案。但是,在按照建议修改我的代码后,仍然无法获得预期的结果。让我发布它,包括适配器。我哪里出错了?请指教
  • 我已经编辑了问题的代码部分,显示了我如何实施您建议的更改。请告知我可能出错的地方。提前致谢
  • @EzraRaleigh 我编辑了答案。我想你现在可以走了。
  • 我已经从 UserListAdapter 类中删除了过滤列表并初始化了适配器,如您在编辑 2 中所示,但我收到一个错误,即 UserListAdapter 中的 UserListAdapter (ArrayList) 无法应用于 (ArrayList, java.util.List)
  • @Joe 是的,这可以通过流实现。虽然这个很容易掌握。
猜你喜欢
  • 2013-09-07
  • 1970-01-01
  • 2018-09-21
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多