0

データの取得後にリストを更新しようとしていますが、試行しても何も起きず、古いデータが表示されます。私はデータを非同期に取得しようとしましたが、同じ問題が発生しました。 コードは次のとおりです。ファイアベースからデータを追加した後にListFragmentがリフレッシュされない

public class myFragment extends ListFragment{ 
private DatabaseReference database = FirebaseDatabase.getInstance().getReference(); 
ArrayAdapter<Event> adapter; 

List<Event> eventsList = new ArrayList<Event>(); 
Event[] events = { 
     new Event(...), //Test data 
     new Event(...), 
     new Event(...) 
}; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_home, container, false); //Custom view 
    return view; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    adapter = new EventsAdapter(getActivity(), events); 
    setListAdapter(adapter); 

    database.child("Events").addValueEventListener(new ValueEventListener() { 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot s : dataSnapshot.getChildren()) { 
       Event event = s.getValue(Event.class); 
       eventsList.add(event); 
       //adapter.add(event); crashes the app for some reason 
      } 
      events = eventsList.toArray(new Event[eventsList.size()]); 
      adapter.notifyDataSetChanged(); 
     } 

     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 

public void onListItemClick(ListView l, View v, int position, long id) {...} 
} 

コードで何が間違っているかわかりません。これをどのように修正できますか?

+0

「何らかの理由でアプリをクラッシュする」例外とスタックトレースを表示する必要があります。 –

+0

@KuroMajutsu:pls、あなたの答えを質問に入れないでください。そのままにして、実際の答えにあなたの全体の答えを入れてください! –

答えて

0

この問題を解決するには、の代わりにChildEventListenerを使用する必要があります。

database.child("Events").addChildEventListener(new ValueEventListener() { 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot s : dataSnapshot.getChildren()) { 
      Event event = s.getValue(Event.class); 
      eventsList.add(event); 
      //adapter.add(event); crashes the app for some reason 
     } 
     events = eventsList.toArray(new Event[eventsList.size()]); 
     adapter.notifyDataSetChanged(); 
    } 

    public void onCancelled(DatabaseError databaseError) { 
    } 
}); 
0

データを変更する予定がある場合は配列を使用しないでください。配列リストを使用してください。

+0

pls、あなたの完全な答えをここに入れてください。それは答えのポストのためのものです。 –

関連する問題