2017-11-09 95 views
0

저는 android 및 firebase 실시간 데이터베이스가있는 프로젝트를 작업 중입니다. 내 프로젝트에서 어떻게이 구조를 달성 할 수 있는지 잘 모르겠습니다.Firebase 사용자를위한 항목을 추가하십시오.

사용자 목록 (이름, 이메일 등)이 있습니다. 단일 사용자에 대해 하나 이상의 항목을 추가하고 싶습니다.

그래서 사용자 1은 가질 수 항목 1 (색상 : 블랙, 비율 : 90 등 등) 항목 2 (...)

이 데이터 또는 구조하는 올바른 방법 인 경우 나는 확실하지 않다 경우가 더 좋은 방법입니다.

중포 기지 구조

enter image description here

그리고이 사용자에 대한 모든 항목을 얻고리스트 뷰에서 그들을 보여줄 수 있어야한다.

어떤 도움을 주는지.

답변

0

아래 그림과 같이 데이터베이스를 구성해야합니다. 이 구조를 사용하면 특정 사용자에 대한 모든 항목을 가져와 ListView에 쉽게 표시 할 수 있습니다.

enter image description here

+0

좋아 좋은를 중포 기지로 데이터를 전송하기 위해, 내가 코드에서이 작업을 수행 할 수있는 방법? 내가 아이에게 추가하는 것처럼 또는? 내 문제가 확실하지 않음 – HurricaneFFs

+0

현재 사용자의 사용자 ID를 가져온 다음 항목 모델을 해당 사용자 ID의 하위 항목으로 푸시해야합니다. Firebase 문서가 도움이 될 것입니다. –

+0

나는이 구조를 얻을 수 없다. 나는이 하나의 userID> Items> ItemId> Data를 얻는다. userID와 Items를 바꿔야합니다. 따라서 그 아이템은 > userID> ItemId> 데이터입니다. – HurricaneFFs

1

난 당신이 RecyclerView와 함께 작동하도록 조언한다.

은 첫째로 당신의 ViewHolder 및 데이터 클래스를 생성 :

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 + 설정 어댑터에 모든 필드를 초기화하기 :

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

방법

// 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); 
      } 
     }); 
+0

두 번째 부분 이었으므로이 부분에 대해 감사드립니다. 유용 할거야! – HurricaneFFs

+0

mFirebaseAdapter = new FirebaseRecyclerAdapter 이렇게하면 onCreateViewHolder와 onBindViewHolder를 구현하게됩니까 ?? – HurricaneFFs

+0

@HurricaneFFs 문제가되지 않습니다! 이러한 이벤트를 구현할 수 있습니다. 소스 : [Documentation] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html) –

관련 문제