代码之家  ›  专栏  ›  技术社区  ›  Spike Johnson

使用FixSt店通过键入字母搜索

  •  0
  • Spike Johnson  · 技术社区  · 7 年前

    我试着整合搜索 Firestore 收藏,使用我输入的信件 EditText .我的意思是,我怎么可以不用按钮,只是实时搜索,就是在我输入任何字母的时候。 编辑文本 结果显示在 ListView 是的。

    我的班级,我从FiSt店获取所有记录:

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

    更新:

    我找到了这个解决方案,但它没有正确工作,当我键入一些字母时-所有信息都从 列表视图 以下内容:

    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) {
    
                        }
                    });
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Raj    7 年前
    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);
                }
            }
        });
    }
    

    我希望这会有帮助。