2017-11-26 6 views
1

Ich habe einige Probleme beim Aktualisieren meiner Freundesliste (mListView) in Echtzeit in der Anwendung zu sehen, es scheint nur zu aktualisieren, wenn es gestartet wird. Ich weiß, es ist eine Frage einer Update-Funktion, aber ich weiß nicht, was ich verwenden soll.So aktualisieren Sie eine Listenansicht in Echtzeit Firebase - Android

(Ich bin ziemlich neu in Firebase und Android, und ich lerne immer noch über sie.)

Hier ist der Code:

private ListView mListView; 
private ArrayList<String> mFriends; 

private List<User> mUserList; 

private UserListAdapter mAdapter; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_profile_friends, container, false); 
    mSearchParam = (EditText) view.findViewById(R.id.searchFriends); 
    mListView = (ListView) view.findViewById(R.id.lvProfileFriends); 
    mPhotos = new ArrayList<>(); 
    mUserList = new ArrayList<>(); 
    mFriends = new ArrayList<>(); 



    DisplayFriends(); 

    return view; 
} 

private void DisplayFriends(){ 
    getFriends(); 
} 


private void updateUsersList(){ 
    Log.d(TAG, "updateUsersList: updating users list"); 

    mAdapter = new UserListAdapter(getActivity(), R.layout.layout_user_listitem, mUserList); 

    mListView.setAdapter(mAdapter); 

    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.d(TAG, "onItemClick: selected user: " + mUserList.get(position).toString()); 

      //navigate to profile activity 
      Intent intent = new Intent(getActivity(), ViewProfileFragment.class); 
      intent.putExtra(getString(R.string.calling_activity), getString(R.string.fragment_profile)); 
      intent.putExtra(getString(R.string.intent_user), mUserList.get(position)); 
      startActivity(intent); 
     } 
    }); 
} 

private void updateFriendsList(){ 
    Log.d(TAG, "getPhotos: getting Friend(s)"); 
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
    for(int i = 0; i < mFriends.size(); i++){ 
     final int count = i; 
     Query query = reference 
       .child(getString(R.string.dbname_users)) 
       .orderByChild(getString(R.string.field_user_id)) 
       .equalTo(mFriends.get(i)); 
     query.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 

        mUserList.add(singleSnapshot.getValue(User.class)); 
       } 
       if(count >= mFriends.size() - 1){ 
        updateUsersList(); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 
} 


private void getFriends(){ 
    Log.d(TAG, "getFollowing: searching for FRIENDS **************************************"); 
    mFriends.clear(); 
    mUserList.clear(); 
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
    Query query = reference 
      .child(getString(R.string.dbname_friends)) 
      .child(FirebaseAuth.getInstance().getCurrentUser().getUid()); 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { 
       Log.d(TAG, "onDataChange: found friend----------------**: " + singleSnapshot.getValue(User.class).toString()); 

       mFriends.add(singleSnapshot.child(getString(R.string.field_user_id)).getValue().toString()); 

       Log.d(TAG, "onDataChange: Freinds user id: " + mFriends.toString()); 
      } 

      updateFriendsList(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

Antwort

0

Werfen Sie einen Blick auf diese:

DatabaseReference dref; 
    ListView listview; 
    ArrayList<String> list=new ArrayList<>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    listview=(ListView)findViewById(R.id.listview); 
    final ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,list); 
    listview.setAdapter(adapter); 
    dref=FirebaseDatabase.getInstance().getReference(); 
    dref.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     list.add(dataSnapshot.getValue(String.class)); 
     adapter.notifyDataSetChanged(); 
     } 
     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
     } 
     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 
     list.remove(dataSnapshot.getValue(String.class)); 
     adapter.notifyDataSetChanged(); 
     } 
     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
    } 
+0

Ah, jetzt macht es Sinn. Vielen Dank – TheRapidSloth

0

Jedes Mal, wenn Sie ein Update auf Feuerbasis Friend erhalten Sie kann auf dem Adapter adapter.notifyDataSetChanged() anrufen, so würde Adapter wissen, dass ein Update durchgeführt werden muss.

Ich würde vorschlagen, Sie RecyclerView für diesen Zweck zu verwenden, da es flexibler als ein Listview ist.

+0

Ich verstehe nicht ganz die Antwort. Von dem, was ich verstehe, wenn ich Daten (onDataChange) von Firebase in getFriendsList() empfange und ich adapter.notifyDataSetChanged() darin setze (ich weiß nicht, ob das dort war, wo ich es setzen muss). Wenn Sie könnten, bitte erläutern Sie, damit ich verstehe. – TheRapidSloth

+0

Okay, lassen Sie mich es einfach machen. Rufen Sie notifydatasetchanged() auf, wann immer Ihre Liste aktualisiert werden soll. Wenn beispielsweise ein neuer Freund zu Ihrer Firebase hinzugefügt wird, aktualisieren Sie einfach Ihre mUserList mit neuen Werten und rufen Sie adapter.notifydatasetchanged() auf dem Adapter auf. – MezzyDroid

Verwandte Themen