2017-11-26 12 views
1

フレンドリスト(mListView)ビューをアプリケーションでリアルタイムに更新する際に問題が発生しましたが、起動時にのみ更新されるようです。私はその更新機能の問題を知っているが、私は何を使用するのか分からない。 リアルタイムのFirebaseでリストビューを更新する方法 - Android

は(私はfirebaseおよびAndroidに、むしろ新たなんだ、と私はまだそれらについて学んでいる。)ここで

コードです:あなたはfriendListあなたにfirebase更新を受信するたびに

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) { 

     } 
    }); 
} 

答えて

0

はこれを見ている:

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

ああ今それは理にかなっています。ありがとう – TheRapidSloth

0

アダプターでadapter.notifyDataSetChanged()と呼ぶと、アダプターは更新を実行する必要があることを知ることができます。

私はそれがリストビューよりも柔軟性があるとして、あなたは、この目的のためにRecyclerViewを使用することをお勧めします。

+0

私は完全に答えを理解していません。私がgetFriendsList()のFirebaseからデータ(onDataChange)を受け取ったときに理解したところから、adapter.notifyDataSetChanged()を配置しました(私はそれを置く必要があるかどうかはわかりません)。あなたができるなら、私は理解するように精巧にしてください。 – TheRapidSloth

+0

私はそれを簡単にしましょう。あなたのリストを更新したいときは、notifydatasetchanged()を呼び出します。たとえば、新しい友達がfirebaseに追加された場合は、mUserListを新しい値で更新し、アダプタのadapter.notifydatasetchanged()を呼び出します。 – MezzyDroid

関連する問題