2017-02-18 16 views
0

Я пытаюсь заполнить свое listview данными из запроса firebase. Мой код:Создать listview из запроса firebase

public class ShowGoalsListActivity extends AppCompatActivity { 

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference messages = mDatabase.child("messages"); 
ArrayList<String> NameList = new ArrayList<String>();; 
public void onCreate(Bundle saveInstanceState) 
{ 
    super.onCreate(saveInstanceState); 
    setContentView(R.layout.goals_list); 
    ListView animalList=(ListView)findViewById(R.id.listViewAnimals); 

    getNames(); 

    ArrayAdapter<String> arrayAdapter = 
      new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, NameList); 
    animalList.setAdapter(arrayAdapter); 

    animalList.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> arg0, View v,int position, long arg3) 
     { 
      String selectedAnimal=NameList.get(position); 
      Toast.makeText(getApplicationContext(), "Animal Selected : "+selectedAnimal, Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

void getNames() 
{ 

    Query queryRef = messages.orderByChild("pages"); 
    queryRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      Map data = (Map) dataSnapshot.getValue(); 
      String name = (String) data.get("name"); 
      NameList.add(name); 
     } 
     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot){ 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError){} 
     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s1){} 
     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s2){} 
    }); 
} 
} 

Но когда я перехожу к своему расположению, этот список пуст. Но если я перейду к другому макету, а затем вернусь к списку целей, то listview содержит все элементы, которые мне нужны. Что может быть проблемой?

ответ

1

Данные загружаются из Firebase асинхронно. Чтобы предупредить Android о необходимости перерисовать список, вам необходимо позвонить notifyDataSetChanged() после изменения данных адаптера.

public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     Map data = (Map) dataSnapshot.getValue(); 
     String name = (String) data.get("name"); 
     NameList.add(name); 
     arrayAdapter.notifyDataSetChanged(); 
    } 

Чтобы сделать эту работу, вам нужно сделать arrayAdapter в `членов области деятельности:

public class ShowGoalsListActivity extends AppCompatActivity { 
    ArrayAdapter<String> arrayAdapter; 
    ... 
+0

Спасибо! Он работает – DzouSi

+0

Приятно слышать. Если бы мой ответ был полезен, нажмите кнопку вверху слева от него. Если он ответил на ваш вопрос, нажмите галочку, чтобы принять его. Таким образом, другие знают, что вам (в достаточной мере) помогли. –

 Смежные вопросы

  • Нет связанных вопросов^_^