2017-01-15 7 views
0

私はFirebaseでチャットアプリケーションを作成し、XMLでRecyclerViewを使用し、AndroidでFirebaseRecyclerAdapterを使用していますが、問題はEditTextでメッセージを送信すると、メッセージが正常に送信され、レイアウトで設定した右側あなたは以下のコードで見ることができますが、問題は、私はアプリを閉じて再起動すると、メッセージが左サイドへ行くことであるよう:FirebaseRecyclerAdapterで複数のレイアウトを設定する方法は?

  mFirebaseRecyclerAdapter = new FirebaseRecyclerAdapter<MessageModel, MessageViewHolder>(
       MessageModel.class, 
       R.layout.layout_message_sender, 
       MessageViewHolder.class, 
       mFirebaserefrence_messages) { 


      @Override 
      public int getItemViewType(int position) { 
       MessageModel model = getItem(position); 
       if (model.getUserId() == mUserId) { 
        return R.layout.layout_message_sender; 
       } 
       else { 
        return R.layout.layout_message_recipitent; 
       } 
      } 

      @Override 
      protected void populateViewHolder(MessageViewHolder viewHolder, MessageModel model, int position) { 
       viewHolder.mTextView_userMessage.setText(model.getUserMessage()); 
       if (model.getUserName() == null) { 
        viewHolder.mTextView_userName.setText("Anonymous"); 
       } else { 
        viewHolder.mTextView_userName.setText(model.getUserName()); 
       } 
       if (model.getUserImageUrl() == null) { 
        viewHolder.mCircleImageView_userImage 
          .setImageDrawable(ContextCompat.getDrawable(ChatActivity.this, 
            R.drawable.ic_account_circle_red_48dp)); 
       } else { 
        Glide.with(ChatActivity.this) 
          .load(model.getUserImageUrl()) 
          .into(viewHolder.mCircleImageView_userImage); 
       } 
      } 

     }; 

     mFirebaseRecyclerAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
      @Override 
      public void onItemRangeInserted(int positionStart, int itemCount) { 
       super.onItemRangeInserted(positionStart, itemCount); 
       int messageCount = mFirebaseRecyclerAdapter.getItemCount(); 
       int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition(); 
       // If the recycler view is initially being loaded or the user is at the bottom of the list, scroll 
       // to the bottom of the list to show the newly added message. 
       if (lastVisiblePosition == -1 || 
         (positionStart >= (messageCount - 1) && lastVisiblePosition == (positionStart - 1))) { 
        mRecyclerView.scrollToPosition(positionStart); 
       } 
      } 
     }); 

     mRecyclerView.setLayoutManager(mLinearLayoutManager); 
     mRecyclerView.setAdapter(mFirebaseRecyclerAdapter); 

     mEditText_message = (EditText) findViewById(R.id.editText_message); 
     mEditText_message.addTextChangedListener(new TextWatcher() { 
                @Override 
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
                } 

                @Override 
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
                 if (charSequence.toString().trim().length() > 0) { 
                  mImageButton.setEnabled(true); 
                 } else { 
                  mImageButton.setEnabled(false); 
                 } 
                } 

                @Override 
                public void afterTextChanged(Editable editable) { 
                } 
               } 
     ); 

     mImageButton = (ImageButton) findViewById(R.id.imageButton_send); 

     mImageButton.setOnClickListener(this); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     mFirebaseAuth.addAuthStateListener(mFirebaseAuthListener); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if (mFirebaseAuthListener != null) { 
      mFirebaseAuth.removeAuthStateListener(mFirebaseAuthListener); 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.item_signOut: 
       mFirebaseAuth.signOut(); 
       startActivity(new Intent(ChatActivity.this, SignInActivity.class)); 
       finish(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     if (v == mImageButton) { 
      MessageModel messageModel = new MessageModel(mUserId, 
        mUserImageUrl, 
        mEditText_message.getText().toString(), 
        mUsername, 
        null); 
      mFirebaserefrence_messages.push().setValue(messageModel); 
      mEditText_message.setText(null); 
     } 
    } 
} 

答えて

0

public Class MyAdapter extends FirebaseRecyclerAdapter<ModelClass, ViewHolderClass> { 
 

 
    private static final int LAYOUT_ONE = 1; 
 

 
    public MyAdapter(Class<ModelClass> modelClass, 
 
         int modelLayout, 
 
         Class<ViewHolderClass> viewHolderClass, 
 
         Query ref) { 
 

 
     super(modelClass, modelLayout, viewHolderClass, ref); 
 

 
    } 
 
    
 
    @Override 
 
    public ViewHolderClass onCreateViewHolder(ViewGroup parent, int viewType) { 
 
    
 
     View view; 
 
     
 
     if (viewType == LAYOUT_ONE) { 
 

 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_one, parent, false); 
 
      return new ViewHoldeClassr(view); 
 

 
     } 
 
     
 
     else { 
 

 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_two, parent, false); 
 
      return new ViewHolderClass(view); 
 

 
     } 
 
    } 
 
    
 
    @Override 
 
    public int getItemViewType(int position) 
 
    
 
     ModelClass model = getItem(position); 
 
     
 
     if (model.caseWhenYouWentToUseLayoutOne)) { 
 
      return LAYOUT_ONE; 
 
     } 
 
     
 
     return position; 
 
    } 
 

 
}

1

FirebaseUIアダプタは、1つのレイアウトで均質なリストのために作られました。複数のレイアウトを持つ異種のリストを持つことは、常に追加する面白い機能と考えられていましたが(this original feature request参照)、これまで追加されていませんでした。

FirebaseUIライブラリにマルチレイアウトのサポートを具体的に追加するための公開機能リクエストがあります:https://github.com/firebase/FirebaseUI-Android/issues/305

これにあなたの投票/ + 1を追加したい場合があります。

関連する問題