从Cloud Firestore中的搜索视图中搜索用户,然后使用recyclerview对其进行过滤

时间:2018-11-21 10:49:57

标签: android firebase google-cloud-firestore

如主题所述。我希望能够使用searchview按用户名搜索用户。我已经在recyclerview中显示了所有用户,但是找不到过滤它们的方法。我正在使用Cloud Firestore。可能吗还是我实际上需要第三部分?到目前为止,我找到的所有指南和教程都在firebase数据库上。

适配器代码。

vpd

}

用户列表显示具有recylerview的用户。

public class AllUserAdapter extends FirestoreRecyclerAdapter<AllUsers, AllUserAdapter.AllUsersHolder> {

private OnItemClicklistener mOnItemClicklistener;
public AllUserAdapter(@NonNull FirestoreRecyclerOptions<AllUsers> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull AllUsersHolder holder, int position, @NonNull AllUsers model) {
    holder.textViewUsername.setText(String.valueOf(model.getName()));
    holder.textViewEmail.setText(model.getEmail());
    holder.setAvatar(model.getAvatar());

}

@NonNull
@Override
public AllUsersHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.all_user_list_display, viewGroup, false);
    return new AllUsersHolder(view);
}

class AllUsersHolder extends RecyclerView.ViewHolder{
    TextView textViewUsername;
    TextView textViewEmail;
    ImageView imageViewAvatar;

    public AllUsersHolder(@NonNull View itemView) {
        super(itemView);
        textViewUsername = itemView.findViewById(R.id.all_user_username);
        textViewEmail = itemView.findViewById(R.id.all_user_userEmail);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && mOnItemClicklistener!= null){
                    mOnItemClicklistener.onItemClick(getSnapshots().getSnapshot(position), position);
                }
            }
        });

    }

    public void setAvatar(String avatar){
        imageViewAvatar = (ImageView) itemView.findViewById(R.id.all_user_profile_image);
        Picasso.get().load(avatar).into(imageViewAvatar);
    }
}

public interface OnItemClicklistener {
    void  onItemClick(DocumentSnapshot snapshot, int position);
}

public void setOnItemClickListener(OnItemClicklistener listener){
    mOnItemClicklistener = listener;
}

}

3 个答案:

答案 0 :(得分:0)

Firebase 不支持本机索引编制或在数据库属性中搜索文本字段。此外,下载整个节点以搜索客户端的字段根本不可行。如offical documentation中所指定,要启用对Cloud FIrestore数据库的全文本搜索,您应使用AlgoliaElasticsearch之类的第三方搜索服务。

This 是有关Cloud Firestore的示例。

如果不需要这样做,您应该考虑使用如下查询:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference brandsRef = rootRef.collection("brands");
brandsRef.orderBy("userName").startAt(searchName).endAt(searchName + "\uf8ff")

答案 1 :(得分:0)

使用TextWatcher并相应地更新适配器

etSearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // When user changed the Text
                String searchText = etSearch.getText().toString();
                arrUpdateList = new ArrayList<>();
                for (int i = 0; i < arrYourList.size(); i++) {
                    if (Pattern.compile(Pattern.quote(searchText), Pattern.CASE_INSENSITIVE).matcher(arrYourList.get(i).title).find() {

                        arrUpdateList.add(arrYourList.get(i));
                    } else {
                    }
                }
                if (arrUpdateList.size() > 0) {
                    tvEmptyView.setVisibility(View.GONE);
                    lvSpecialOffer.setVisibility(View.VISIBLE);
                    bookCouponAdapter = new BookCouponAdapter(BookCouponListActivity.this, arrUpdateList);
        lvSpecialOffer.setAdapter(bookCouponAdapter);
                } else if (arrUpdateList.size() <= 0) {
                    lvSpecialOffer.setVisibility(View.GONE);
                    tvEmptyView.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {
                // TODO Auto-generated method stub
            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
            }
        });

答案 2 :(得分:0)

我已经尝试过使用你们的解决方案,但是我没有使它起作用。.我想第三部分是使这项工作有效。

不过,谢谢您的回答。干杯