【问题标题】:How to update a List view in real-time Firebase - Android如何在 Firebase 中实时更新列表视图 - Android
【发布时间】:2017-11-26 19:29:59
【问题描述】:

我在应用程序中实时更新我的​​好友列表(mListView)视图时遇到了一些问题,它似乎只在启动时更新。我知道这是一个更新功能的问题,但我不知道该使用什么。

(我对 firebase 和 android 还比较陌生,我还在学习它们。)

代码如下:

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

        }
    });
}

【问题讨论】:

    标签: android firebase firebase-realtime-database real-time


    【解决方案1】:

    看看这个:

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

    【讨论】:

    • 啊,现在说得通了。谢谢
    【解决方案2】:

    每当您在friendList 上收到firebase 更新时,您都可以在适配器上调用adapter.notifyDataSetChanged(),这样适配器就会知道必须执行更新。

    我建议您为此目的使用 RecyclerView,因为它比 listview 更灵活。

    【讨论】:

    • 我不完全理解答案。据我了解,当我在 getFriendsList() 中从 Firebase 接收数据(onDataChange)并将 adapter.notifyDataSetChanged() 放入其中时(我不知道这是否是我必须放置的地方)。如果可以,请详细说明以便我理解。
    • 好吧,让我简单点。当您希望更新列表时,请调用 notifydatasetchanged()。例如,如果一个新朋友被添加到您的 firebase 中,只需使用新值更新您的 mUserList 并在适配器上调用 adapter.notifydatasetchanged()。
    猜你喜欢
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    相关资源
    最近更新 更多