【问题标题】:Searching by typed letters using Firestore使用 Firestore 按键入的字母搜索
【发布时间】:2018-12-02 23:38:11
【问题描述】:

我尝试使用在EditText 中输入的字母将搜索集成到Firestore 集合中。我的意思是,我怎样才能在没有任何按钮的情况下做到这一点,只是实时搜索,即当我在EditText 中输入任何字母时,结果就会出现在ListView 中。

我的班级,我从 Firestore 中检索了所有记录:

public class AllPlaces extends AppCompatActivity {

private EditText eName;
private ListView mList;

private FirebaseFirestore firestore = FirebaseFirestore.getInstance();
private CollectionReference reference = firestore.collection("Users");
private SearchAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_all_places);

    mList = findViewById(R.id.listSearch);
    eName = findViewById(R.id.editSearch);

    reference.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            List<SearchModel> names = new ArrayList<>();
            if(task.isSuccessful()){
                for(QueryDocumentSnapshot document : task.getResult()) {
                    SearchModel model = document.toObject(SearchModel.class);
                    names.add(model);
                }
                mList = findViewById(R.id.listSearch);
                adapter = new SearchAdapter(AllPlaces.this, names);
                mList.setAdapter(adapter);
            }
        }
    });
}
}

更新:

我找到了这个解决方案,但是当我输入一些字母时它不能正常工作 - 所有信息都从 ListView 消失:

eName.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) {

                        AllPlaces.this.adapter.getFilter().filter(s);
                    }

                    @Override
                    public void afterTextChanged(Editable s) {

                    }
                });

【问题讨论】:

  • 你可以看看here
  • @AlexMamo 谢谢!
  • 不客气!如果您认为该帖子中的答案对您有所帮助,请考虑投票。谢谢!

标签: android firebase search android-edittext google-cloud-firestore


【解决方案1】:
private FirebaseFirestore firestore = FirebaseFirestore.getInstance();
private CollectionReference reference = firestore.collection("Users");
Query q;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_all_places);

    q = firestore.collection("Users");
    showAdapter(q);

eName.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) {
        if (charSequence.toString().length() == 0) {
            q = firestore.collection("Users");
            showAdapter(q);
         } // This is used as if user erases the characters in the search field.
         else {
             q = reference.orderBy("name").startAt(charSequence.toString().trim()).endAt(charSequence.toString().trim() + "\uf8ff"); // name - the field for which you want to make search
             showAdapter(q);
          }
          adapter.notifyDataSetChanged();
    }
    @Override
    public void afterTextChanged(Editable editable) {
    }
});

void showAdapter(Query q1) {
    q1.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            List<SearchModel> names = new ArrayList<>();
            if(task.isSuccessful()){
                for(QueryDocumentSnapshot document : task.getResult()) {
                    SearchModel model = document.toObject(SearchModel.class);
                    names.add(model);
                }
                mList = findViewById(R.id.listSearch);
                adapter = new SearchAdapter(AllPlaces.this, names);
                mList.setAdapter(adapter);
            }
        }
    });
}

我希望这会有所帮助..

【讨论】:

  • 有一些进展,tnaks!但它工作得很好,当我输入任何字母时,当我删除字母时,列表视图不会回到正常视图 - 变成空的。@Raj
  • 我也添加了那个案例。 (在 cmets 中明确提及)。每次更改文本时也会调用方法。所以你应该等待获取结果。你应该检查一次。因此,您应该接受并投票赞成对其他人也有帮助的答案。
  • 是的,例如,当您键入 2 个字母并删除其中一个字母时,此方法有效 - 结果会发生变化 - 我不是很好,但在删除所有字母时不起作用,在此案例 - 是空的..@Raj
  • 目前 - 在删除 EditView 中的所有字母后 - 它保持最后一个搜索结果,即在此之前..
  • 非常感谢@Raj!我得到了它。是这样吗,为了不采用字母大小写,我必须使用 .toLowerCase(), .toUpperCase()?
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多