Извлечение базы данных из Firembase необходимо 2-й щелчок для отображения данных - PullRequest
0 голосов
/ 03 февраля 2020

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

вот код:

  btnprediksi.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

         efekGK(); 

        }
    });

вот метод efekGK

private void efekGK() {

    final DatabaseReference CekDataGK;
    posisi="GK";
    CekDataGK=FirebaseDatabase.getInstance().getReference();
    CekDataGK.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.child("PlayerSkills").child(username).child("GK").exists()) {

                PlayersSkill playerData = dataSnapshot.child("PlayerSkills")
                        .child(username)
                        .child("GK")
                        .getValue(PlayersSkill.class);

                assert playerData != null;

                 String basGKform = playerData.getNumform();
                 String basGKExp=playerData.getNumexperience();
                 Toast.makeText(HomeActivity.this, basGKform, Toast.LENGTH_SHORT).show();


            } 
        }

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

        }
    });
}

я использую Toast для проверки если данные доступны или нет. результат, когда я нажимаю кнопку, чтобы тост ничего не отображал, но когда я нажимаю снова, тост отображает данные, которые я ожидал ...

РЕДАКТИРОВАТЬ: я следую совету Алекса ios, и он отлично работает, если переменная отображается внутри метод "efekgk" ... но если я поместил его вне метода, то при первом нажатии он снова ничего не отобразит.

сначала я определяю переменную вне метода

   public class HomeActivity extends AppCompatActivity {
   private String basGKform, basGKExp; 
    .....}

, и я перемещаю результат в новый метод с именем displaydata

   private void displaydata() {
     Toast.makeText(HomeActivity.this, basGKform, Toast.LENGTH_SHORT).show();
   }

При первом щелчке мышью ничего не происходит

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

По-прежнему ничего не отображается, потому что asyn c, и он работает нормально с моим предложением, потому что это обратный вызов, когда данные готовы. Вы должны сделать это с обратным вызовом или, если вы знаете, прежде чем щелкнуть то, что вы хотите запросить, и это не зависит от того, что пользователь делает в начале действия, чтобы запустить запрос с AsyncTask и когда вы собираетесь нажать на данные будут готовы.

0 голосов
/ 03 февраля 2020

Это происходит потому, что запрос асинхронный. И когда вы нажимаете, чтобы отобразить, FireBase не отправляет вам данные, а когда вы нажимаете снова, он отображает, потому что вы получили данные из предыдущего запроса.

Я предлагаю сделать это с обратным вызовом

    public interface DataIsAvailable {
        public void onSuccess(DataSnapshot data);
    }

Триггер обратного вызова

private void efekGK(Final DataIsAvailable listener) {
    final DatabaseReference CekDataGK;
    posisi="GK";
    CekDataGK=FirebaseDatabase.getInstance().getReference();
    CekDataGK.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
               listener.onSuccess(dataSnapshot)

            } 
        }

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

        }
    });
}

И затем при onClick

efekGK(new DataIsAvailable() {
        @Override
        public void onSuccess(DataSnapshot dataSnapshot) {

                PlayersSkill playerData = dataSnapshot.child("PlayerSkills")
                        .child(username)
                        .child("GK")
                        .getValue(PlayersSkill.class);

                assert playerData != null;

                 String basGKform = playerData.getNumform();
                 String basGKExp=playerData.getNumexperience();
                 Toast.makeText(HomeActivity.this, basGKform, Toast.LENGTH_SHORT).show();

        }

});

Это должно работать.

...