Поиск по набранным буквам с помощью Firestore - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь интегрировать поиск в Firestore коллекциях, используя буквы, которые я набрал EditText. Я имею в виду, как я могу сделать это без каких-либо кнопок, просто поиск в реальном времени, то есть когда я набираю любые буквы в 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);
            }
        }
    });
}
}

UPDATE:

Я нашел это решение, но оно не работало правильно, когда я набираю какую-то букву - вся информация исчезает из 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) {

                    }
                });

1 Ответ

0 голосов
/ 24 июня 2018
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);
            }
        }
    });
}

Надеюсь, это поможет ..

...