2017-02-05 4 views
0

Я новичок в Firebase. Чтобы создать список в списке лидеров в моем приложении для Android, я создал базу данных на базе firebase, как показано ниже: enter image description hereFirebase Query and database sturcture

Где все пользовательские идентификаторы находятся под узлом «users» и под каждым узлом userUID являются пользовательскими данные. Я пытался использовать методы класса Query для доступа к 3 пользователям, имеющим самое высокое значение «totalIMPs» верхнего уровня, и показывать их «имя» в Listview (list_TotalIMP). Чтобы сделать это, я попытался следующие коды:

final ArrayAdapter<String> adapter_totalIMPs=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1); 
list_TotalIMPs=(ListView)findViewById(R.id.listView_TotalIMPs); 
list_TotalIMPs.setAdapter(adapter_totalIMPs); 
Query query1=databaseReference.child("users").orderByChild("totalIMPs").limitToLast(3); 
query1.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) 
     { 
      adapter_totalIMPs.clear(); 
      adapter_totalIMPs.add("1");//for testing 
      adapter_totalIMPs.add("2");//for testing 
      adapter_totalIMPs.add("3");//for testing 
      for(DataSnapshot postsnapshot:dataSnapshot.getChildren()) 
      { 
       adapter_totalIMPs.add((String)postsnapshot.child("name").getValue()); 
       Toast.makeText(MainActivity.this,"Add in list: "+(String)postsnapshot.child("name").getValue(),Toast.LENGTH_LONG).show(); 
      } 
     } 
     @Override public void onCancelled(DatabaseError databaseError){Toast.makeText(MainActivity.this,"Add in list: CANCELLED",Toast.LENGTH_LONG).show();} 
    }); 

Однако только тестирование Струна «1», «2» и «3» появилась в моем списке, а также, нет Toast показа. Это означает, что проблема возникает в цикле «for», и я полагаю, что это имеет какое-то отношение к структуре базы данных. Но у меня проблемы с этим. Может кто-нибудь помочь? Огромное спасибо.

(мне было интересно, если datasnapshot пуст, так что «для» цикла никогда не вошел?)

+0

Вы включили изображение вашего дерева JSON в свой вопрос. Пожалуйста, замените это на фактический JSON как текст, который вы можете легко получить, щелкнув ссылку Экспорт JSON в [вашей консоли базы данных Firebase] (https://console.firebase.google.com/project/_/database/data/) , Наличие JSON в качестве текста делает его доступным для поиска, позволяет нам легко использовать его для тестирования с вашими фактическими данными и использовать его в нашем ответе, и в целом это просто хорошая вещь. –

+0

Вы можете проверить этот последний вопрос, поставив точку останова на цикл 'for', а затем запустив приложение в отладчике. –

ответ

1

Вы устанавливаете адаптер beforing чтения данных. Попробуйте настроить адаптер в методе onChange:

Query query1=databaseReference.child("users").orderByChild("totalIMPs").limitToLast(3); 
query1.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) 
     { 
      adapter_totalIMPs.clear(); 
      adapter_totalIMPs.add("1");//for testing 
      adapter_totalIMPs.add("2");//for testing 
      adapter_totalIMPs.add("3");//for testing 
      for(DataSnapshot postsnapshot:dataSnapshot.getChildren()) 
      { 
       adapter_totalIMPs.add((String)postsnapshot.child("name").getValue()); 
       Toast.makeText(MainActivity.this,"Add in list: "+(String)postsnapshot.child("name").getValue(),Toast.LENGTH_LONG).show(); 
      } 
      list_TotalIMPs.setAdapter(adapter_totalIMPs); 
     } 
     @Override public void onCancelled(DatabaseError databaseError){Toast.makeText(MainActivity.this,"Add in list: CANCELLED",Toast.LENGTH_LONG).show();} 
    }); 
+0

По-прежнему это не сработало :(Я получил те же данные тестирования «1», «2» и «3», ничего больше, нет тостов. – Einsambr

+0

@ Rosario: это тоже была моя первоначальная мысль (вызов 'notifyDataSetChanged() 'было бы лучшим исправлением в этом случае btw). Но так как появляются' 1', '2' и' 3', кажется, что адаптер уже получил уведомление (я не уверен, как это сделать). –

+0

Прошу прощения, но я только что решил проблему. Это была просто ошибка в базе данныхReference (о которой я не упоминал выше) lol – Einsambr