2016-08-22 3 views
1

ファイアベースをバックエンドとして使用してチャットアプリケーションを作成しています。 現在、RecyclerViewでメッセージを送受信するためのアイテムレイアウトを設定する際に問題が発生しています。 送信と受信の両方のメッセージに同じアイテムレイアウトを使用しても、完全に機能しました。 しかし、メッセージを送信するために画面を左側の部分とメッセージを受信する右側の部分に分割したいと考えています。 FirebaseRecyclerAdapterオブジェクトを作成するとき、そのパラメータとして1つのレイアウトしか渡すことができません。私はこの問題に本当に苦労しています。チャットアプリケーションの2つのアイテムレイアウトにFirebaseRecyclerAdapterを使用するには

private void loadMessages() { 

    mAdapter = new FirebaseRecyclerAdapter<MessageToSend, NewMessageViewHolder>(
      MessageToSend.class, 
      R.layout.single_message_new, 
      NewMessageViewHolder.class, 
      messageRef.child(sender).child(receiver) 
    ) { 
     @TargetApi(Build.VERSION_CODES.M) 
     @Override 
     protected void populateViewHolder(NewMessageViewHolder viewHolder, MessageToSend model, int position) { 
      if (sender.equals(model.getSender())) { 

       viewHolder.outMessage.setTextColor(getResources().getColor(R.color.darkGreen)); 
      } 
      else { 
       viewHolder.outMessage.setTextColor(Color.BLACK); 
       //viewHolder.outMessage.setGravity(Gravity.RIGHT); 
      } 
      viewHolder.outMessage.setText(model.getMessage()); 
      viewHolder.sender.setText(model.getSender()); 
     } 
    }; 

    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
     @Override 
     public void onItemRangeInserted(int positionStart, int itemCount) { 
      super.onItemRangeInserted(positionStart, itemCount); 
      int friendlyMessageCount = mAdapter.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 >= (friendlyMessageCount - 1) && lastVisiblePosition == (positionStart - 1))) { 
       recyclerView.scrollToPosition(positionStart); 
      } 
     } 
    }); 
    recyclerView.setLayoutManager(mLinearlayoutManager); 
    recyclerView.setAdapter(mAdapter); 
} 

ViewHolderクラスは

public static class InMessageViewHolder extends RecyclerView.ViewHolder{ 
    TextView inMessage; 
    TextView receiver; 
    CircleImageView receiverImage; 

    public InMessageViewHolder(View itemView) { 
     super(itemView); 
     inMessage = (TextView) itemView.findViewById(R.id.textView11); 
     receiver = (TextView) itemView.findViewById(R.id.textView12); 
    } 
} 

答えて

2

あなたはFirebaseRecyclerAdaptergetItemViewTypeはこれを達成するためにオーバーライドすることができます。

// Check if the item at position is sender 
private boolean isSender(int position) { 
    sender.equals(getItem(position).getSender()); 
} 

@Override 
public int getItemViewType(int position) { 
    if (isSender(position)) { 
     return R.layout.my_sender_layout; 
    } else { 
     return R.layout.my_receiver_layout; 
    } 
} 

これは条件付きでレイアウトを膨らませるRecyclerAdapterの原因となります。しかし、あなたはまだViewHolderというサブクラスを1つしか持たないので、public MyViewHolder(View itemView)を実装するときにitemViewが2つのレイアウトのうちの1つになるように準備されていることを確認する必要があります。

+0

onCreateViewHolderオーバーライドするよう

-1することができ模型レイアウトの世話をしてください?それはloadMessages()で匿名であるべきですか? isSenderメソッドからboolを返すには、渡された位置パラメータと比較する必要がありますか? –

+0

例isSenderメソッドを含めるように私の答えを更新しました。 –

+0

は正解ですか? –

0

あなたが延びており、専用のビューのためのfunctinalityを提供FirebaseRecyclerAdapterのいくつかのコードを使用するためにもhttps://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView#prerequisite

をすることができますお読みください。 Firebase Queryのような他のスーパークラスも気になるでしょう。あなたは()メソッドisSenderを作成する方法を私に説明してもらえ

関連する問題