在停止

时间:2017-08-08 19:48:27

标签: android firebase firebase-realtime-database firebaseui

我正在使用以下代码来填充包含firebase数据库中子项的数据的列表。该列表已成功填写,但我遇到了一个问题:FirebaseListAdapter在停止之前被多次调用,当我在其他活动中使用它时不会发生什么。

一个奇怪的事情是,当我点击一个特定的listView项目时,来自另一个项目的数据会通过我的openChat意图传递,这会导致错误的数据被检索到我打开的聊天活动中。似乎多次调用的东西搞乱了所有数据。

有人可以指出我的代码可能有什么问题和/或我必须做些什么来优化它?

//database references
chatsRef = FirebaseDatabase.getInstance().getReference().child("chats").child(mAuth.getCurrentUser().getUid()); //the children of this are other users IDs
usersRef = FirebaseDatabase.getInstance().getReference().child("users");

////////// code for populateView I use within FirebaseListAdapter  ///////////
FirebaseListAdapter<ChatUsers> firebaseListAdapter = new FirebaseListAdapter<ChatUsers>(getActivity(), ChatUsers.class, R.layout.item_user_listing, chatsRef) {
protected void populateView(View view, ChatUsers chatUsers, int position) {

                TextView nameChatItemList = (TextView) view.findViewById(R.id.nameChatItemList);
                id_other_user = getRef(position).getKey();

                usersRef.child(id_other_user).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        //for (DataSnapshot ds : dataSnapshot.getChildren())
                        Toast.makeText(mActivity, dataSnapshot.getValue().toString(), Toast.LENGTH_SHORT).show();
                        name = dataSnapshot.child("name").getValue().toString();                    
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent openChat= new Intent(getActivity().getApplicationContext(), Chat.class);
                        openChat.putExtra("iduser_chat", id_outro_usuario);
                        openChat.putExtra("name_user_chat", name);
                        startActivity(openChat);
                    }
                });
}

}

编辑根据Farmaan的建议实施的更改

FirebaseListAdapter<ChatUsers> firebaseListAdapter = new FirebaseListAdapter<ChatUsers>(getActivity(), ChatUsers.class, R.layout.item_user_listing, ChatsRef) {
            @Override
            protected void populateView(View view, ChatUsers chatUsers, int position) {

                TextView nomeImageChatItemList = (TextView) view.findViewById(R.id.nomeChatItemList);

                String id_other_user = getRef(position).getKey();
                usersRef.child(id_other_user).addListenerForSingleValue(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        String name = dataSnapshot.child("name").getValue().toString();
                                              view.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                usersRef.child(id_other_user).addListenerForSingleValue(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        String name = dataSnapshot.child("name").getValue().toString();

                                        Intent openChat = new Intent(getActivity().getApplicationContext(), Chat.class);
                                        openChat.putExtra("iduser_chat", id_other_user);
                                        openChat.putExtra("nameuser_chat", name);
                                        startActivity(openChat);
                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {

                                    }
                                });
                            }
                        });
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        };

1 个答案:

答案 0 :(得分:0)

由于id_other_username是类级别字段,并且每次填充视图时都要更新它。因此,填充的最后一个视图将决定用户ID和名称。这是错误的用你的代码。

chatsRef = FirebaseDatabase.getInstance().getReference().child("chats").child(mAuth.getCurrentUser().getUid()); //the children of this are other users IDs
        usersRef = FirebaseDatabase.getInstance().getReference().child("users");

        ////////// code for populateView I use within FirebaseListAdapter  ///////////
        protected void populateView (View view, ChatUsuarios chatUsuarios,int position){

            TextView nameChatItemList = (TextView) view.findViewById(R.id.nameChatItemList);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    String id_other_user = getRef(position).getKey();

                    usersRef.child(id_other_user).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //for (DataSnapshot ds : dataSnapshot.getChildren())
                            String name = dataSnapshot.child("name").getValue().toString();
                            Intent openChat = new Intent(getActivity().getApplicationContext(), Chat.class);
                            openChat.putExtra("iduser_chat", id_other_user);
                            openChat.putExtra("name_user_chat", name);
                            startActivity(openChat);

                            Toast.makeText(mActivity, dataSnapshot.getValue().toString(), Toast.LENGTH_SHORT).show();

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                }
            });

        }