按编辑文字过滤结果

时间:2018-07-08 13:03:35

标签: java android firebase-realtime-database

在我的ExploreFragment.java中,我有一个 EditText ,它基本上允许用户搜索存储在我的 Firebase实时数据库中的国家/地区名称。 我要实现的是,当用户在 EditText 中键入内容,然后在键盘上按“提交”时,它会进行查询,以检索每个在其名称中键入了字符串的国家/地区,并重定向到我的片段FilteredResultsFragment.java,其中显示了所检索国家的名称。我的片段有一个带有适配器的回收站视图。 我还没有做到这一点。我需要检索一个带有URL的列表和一个带有名称的列表。 查询应如下所示:

FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
Log.d("TAMANHO","size = "+paisEscolhido.size());
for (int i = 0; i<paisEscolhido.size(); i++) {
    Log.d("CONTINETNE","size = "+paisEscolhido.get(i));
    DatabaseReference paisNomeContinentes = mDatabase.getReference().child("paises");
    Query queries = paisNomeContinentes.orderByChild("Continente").equalTo(paisEscolhido.get(i));

    queries.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        List<String> imagemPaisList = new ArrayList<>();
        List<String> nomePaisList = new ArrayList<>();
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            String imagemPais = ds.child("Imagem").getValue(String.class);
            String nomePais = ds.child("Nome").getValue(String.class);
            imagemPaisList.add(imagemPais);
            nomePaisList.add(nomePais);
        }
        int urlCount = imagemPaisList.size();

        //  int randomImage = new Random().nextInt(urlCount);

        for (int i = 0; i < nomePaisList.size(); i++) {

                Integer randomVariavel = new Random().nextInt(urlCount);

                randomImagemPaisList.add(imagemPaisList.get(randomVariavel));
                randomNomePaisList.add(nomePaisList.get(randomVariavel));

        }

更新

我提出了以下查询:

FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
DatabaseReference paisNomeContinentes = mDatabase.getReference().child("paises");
Query queries = paisNomeContinentes.orderByChild("Nome").startAt("Po");

queries.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        List<String> imagemPaisList = new ArrayList<>();
        List<String> nomePaisList = new ArrayList<>();
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            String imagemPais = ds.child("Imagem").getValue(String.class);
            String nomePais = ds.child("Nome").getValue(String.class);
            imagemPaisList.add(imagemPais);
            nomePaisList.add(nomePais);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});

那应该检索以用户在我的EditText中写的值开头的国家/地区的名称,但是,当我写例如“ Po” 时,它应该给我< strong>“葡萄牙” 和“波兰” ,但是,它却给了我随机图像...

这是数据结构:

enter image description here

UPDATE V2 它实际上给了我“波兰”和“葡萄牙”作为最佳结果,但它显示了除这两个以外的更多ImageView(还有随机图像)...

1 个答案:

答案 0 :(得分:2)

如果您想使用startAt()来过滤数据,则还必须使用endAt(),因为startAt()是查询的起点,而不是过滤器。通过在\uf8ff的搜索字符串后面添加endAt((最后一个unicode字符),您可以限制查询以仅获取以搜索字符串开头的值:

Query queries = paisNomeContinentes.orderByChild("Nome").startAt("Po").endAt("Po" + "\uf8ff");

请记住,这只会获得从搜索字符串开始开始的项目,而不会得到包含搜索字符串的项目。