Список пользователей с определенным дочерним значением в базе данных ListView Firebase - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь перечислить всех пользователей, у которых дочерний элемент session: 2011 из базы данных Firebase Realtime, в ListView. Это моя структура данных:

{
  "Users" : {
    "uid1" : {
      "name" : "Jhon",
      "session" : 2011
    },
    "uid2" : {
      "name" : "Kim",
      "session" : 2011
    }
  }
}

Это мой список активности:

public class ListActivity extends AppCompatActivity {

    ListView lv;
    FirebaseListAdapter adapter;
    private FirebaseAuth mAuth;

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

        mAuth = FirebaseAuth.getInstance();

        FirebaseUser user = mAuth.getCurrentUser();
        String userID = user.getUid();
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users");
        ref.child(userID).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String session = dataSnapshot.child("session").getValue().toString();
                if (session.equals("2011")) {
                    Query query = FirebaseDatabase.getInstance().getReference().child("Users");

                    lv = (ListView) findViewById(R.id.listView);
                    FirebaseListOptions < profile > options = new FirebaseListOptions.Builder < profile > ()
                        .setLayout(R.layout.profile)
                        .setQuery(query, profile.class)
                        .build();
                    adapter = new FirebaseListAdapter(options) {
                        @Override
                        protected void populateView(View v, Object model, int position) {
                            TextView name = v.findViewById(R.id.name);
                            TextView session = v.findViewById(R.id.session);

                            profile user = (profile) model;
                            name.setText("Name: " + user.getName().toString());
                            session.setText("Session: " + user.getSession().toString());
                        }
                    };
                    lv.setAdapter(adapter);
                } else {
                    //
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

А это мой profile класс:

public class profile {
    private String name;
    private String session;

    public profile() {}

    public profile(String name, String session) {
        this.name = name;
        this.session = session;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSession() {
        return session;
    }

    public void setSession(String session) {
        this.session = session;
    }

}

Но проблема в том, что он ничего не возвращает. Что мне здесь не хватает?

Для справки, я попробовал следующее, но когда я сделал это, он вернул только значение пользователя, который в данный момент вошел в систему. Ничего другого.

Query query = FirebaseDatabase.getInstance().getReference().child("Users");

lv = (ListView) findViewById(R.id.listView);
FirebaseListOptions < profile > options = new FirebaseListOptions.Builder < profile > ()
    .setLayout(R.layout.profile)
    .setLifecycleOwner(IdCheckActivity.this)
    .setQuery(query, profile.class)
    .build();
adapter = new FirebaseListAdapter(options) {
    @Override
    protected void populateView(View v, Object model, int position) {
        TextView name = v.findViewById(R.id.name);
        TextView session = v.findViewById(R.id.session);

        profile user = (profile) model;
        name.setText("Name: " + user.getName().toString());
        session.setText("Session: " + user.getSession().toString());
    }
};
lv.setAdapter(adapter);
}

@Override
protected void onStart() {
    super.onStart();
    adapter.startListening();
}

@Override
protected void onStop() {
    super.onStop();
    adapter.startListening();
}

1 Ответ

0 голосов
/ 12 сентября 2018

Вместо использования Query вы можете очень хорошо использовать DatabaseReference, а с помощью orderByChild() это можно сделать так:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();



rootRef.child("Users").orderByChild("session").equalTo(2011).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot data: dataSnapshot.getChildren()){
                    String tempName = data.child("name").getValue(String.class);

                   //with tempName you can access their usernames and you will only get the usernames with session 2011, so you can directly populate your listView from here and use it

                }

            }

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

            }
        });

Переменная tempName будет толькополучите name дочернего элемента Users, с session как 2011. Также, если 2011 хранится как String, используйте его как «2011».

Редактировать: Также, если вы не слушаете изменения и просто хотите увидеть, существует ли такой User, вы можете использовать if(dataSnapshot.exists()) в valueEventListener().

. Заполнить listView с помощью этого кода просто.и очень похоже на то, что вы делаете, и это выглядит так:

ArrayList array = new ArrayList<String>;
ListView listView;

//set the findViewById for the listView

//add the following code in the valueEventListener

array.add(tempName);

ArrayAdapter adapter = new ArrayAdapter(YourActivity.this, android.R.layout.simple_list_item_1, array);
                listView.setAdapter(adapter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...