【问题标题】:Firebase add item for userFirebase 为用户添加项目
【发布时间】:2017-11-09 13:50:38
【问题描述】:

我正在开发一个带有 android 和 firebase 实时数据库的项目。 我不太确定如何为我的项目实现这种结构。

我有一个用户列表(包括姓名、电子邮件等)。 我想为单个用户添加一个/或多个项目。

所以 User1 可以拥有: 项目 1(颜色:黑色,百分比:90 等) 项目 2(...)

我不确定这是否是构建数据的正确方法,或者是否有更好的方法。

Firebase 结构

我应该能够获取该用户的所有项目并在列表视图中显示它们。

任何帮助如何实现这一点。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    我建议您使用 RecyclerView。

    以下示例用作聊天:

    首先创建你的 ViewHolder 和 Data 类:

      public static class FirechatMsgViewHolder extends RecyclerView.ViewHolder {
            TextView userTextView;
            TextView emailUserTextView;
            TextView msgTextView;
            CircleImageView userImageView;
    
            public FirechatMsgViewHolder(View v) {
                super(v);
                userTextView = (TextView) itemView.findViewById(R.id.userTextView);
                emailUserTextView = (TextView) itemView.findViewById(R.id.emailUserTextView);
                msgTextView = (TextView) itemView.findViewById(R.id.msgTextView);
                userImageView = (CircleImageView) itemView.findViewById(R.id.userImageView);
    
            }
        }
    

    数据类:

        public class ChatMessage {
    
        private String text;
        private String name;
        private String email;
        private String photoUrl;
    
        public ChatMessage() {
        }
    
        public ChatMessage(String name, String email, String text, String photoUrl) {
            this.text = text;
            this.name = name;
            this.photoUrl = photoUrl;
            this.email = email;
        }
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getPhotoUrl() {
            return photoUrl;
        }
    
        public void setPhotoUrl(String photoUrl) {
            this.photoUrl = photoUrl;
        }
    }
    

    然后将这些字段添加到 ChatActivity:

    private DatabaseReference mSimpleFirechatDatabaseReference;
     private FirebaseRecyclerAdapter<ChatMessage, FirechatMsgViewHolder>
            mFirebaseAdapter;
    

    然后初始化 onCreate + set 适配器中的所有字段:

    //Create the reference to get data from Firebase.
            mSimpleFirechatDatabaseReference = FirebaseDatabase.getInstance().getReference();
    
    //Fill the adapter with data + add all required listeners
            mFirebaseAdapter = new FirebaseRecyclerAdapter<ChatMessage,
                    FirechatMsgViewHolder>(
                    ChatMessage.class,
                    R.layout.chat_message,
                    FirechatMsgViewHolder.class,
                    mSimpleFirechatDatabaseReference.child("messages")) {
    
                @Override
                protected void populateViewHolder(FirechatMsgViewHolder viewHolder, ChatMessage friendlyMessage, int position) {
                    mProgressBar.setVisibility(ProgressBar.INVISIBLE);
                    viewHolder.userTextView.setText(friendlyMessage.getName());
                    viewHolder.emailUserTextView.setText(friendlyMessage.getEmail());
                    viewHolder.msgTextView.setText(friendlyMessage.getText());
                    if (friendlyMessage.getPhotoUrl() == null) {
                        viewHolder.userImageView
                                .setImageDrawable(ContextCompat
                                        .getDrawable(ChatActivity.this,
                                                R.drawable.profile));
                    } else {
                        Glide.with(ChatActivity.this)
                                .load(friendlyMessage.getPhotoUrl())
                                .into(viewHolder.userImageView);
                    }
                }
            };
    
            mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
                @Override
                public void onItemRangeInserted(int positionStart, int itemCount) {
                    super.onItemRangeInserted(positionStart, itemCount);
                    int chatMessageCount = mFirebaseAdapter.getItemCount();
                    int lastVisiblePosition =
                            mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
                    if (lastVisiblePosition == -1 ||
                            (positionStart >= (chatMessageCount - 1) &&
                                    lastVisiblePosition == (positionStart - 1))) {
                        mMessageRecyclerView.scrollToPosition(positionStart);
                    }
                }
            });
    

    如何向 Firebase 发送数据

    // The way to send data to the database. Add any required path!
            mSendButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    ChatMessage friendlyMessage = new
                            ChatMessage(mUsername,
                            mUseremail,
                            "Some text",
                            mPhotoUrl);
                    mSimpleFirechatDatabaseReference.child("messages")
                            .push().setValue(friendlyMessage);
                }
            });
    

    【讨论】:

    • 这是第二部分,非常感谢。会有用的!
    • mFirebaseAdapter = new FirebaseRecyclerAdapter 这要我实现 onCreateViewHolder 和 onBindViewHolder??
    • @HurricaneFFs 这不是问题!你可以实现这些事件,见源码:Documentation
    • 我想说的是,实际上它并没有叫我那个事件,但实现它们不是问题。
    • Ushkevich,我用普通的 RecyclerView 实现了它,它可以工作。为什么使用 FirebaseRecyclerView 会更好?外汇。我现在不知道如何删除。但我显示所有项目,
    【解决方案2】:

    您应该如下图所示构建您的数据库。使用这种结构,您可以获取特定用户的所有项目并轻松地在 ListView 中显示它们。

    【讨论】:

    • 好的,我如何在代码中做到这一点?喜欢我添加到孩子还是?我不确定我的问题
    • 您应该获取当前用户的用户 ID,然后将项目模型作为该用户 ID 的子项推送。 Firebase 文档应该可以帮助您解决这个问题。
    • 我无法得到这个结构。我得到了这个用户 ID > 项目 > 项目 ID > 数据。我需要交换用户 ID 和项目。所以它的 Items > userID > ItemId > Data。
    • @HurricaneFFs 如果我的解决方案对您有用,请将答案标记为已接受,以便对其他人有所帮助。
    猜你喜欢
    • 2022-01-25
    • 2021-11-09
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多