如何使用具有两种视图类型的 Recycler 创建聊天 UI 但在屏幕上什么也得不到

How to create Chatting UI using Recycler with two view types but get nothing in the screen

我正在尝试从服务器获取聊天数据并显示它。我创建了两个 xml,一个用于接收者,另一个用于发送者。我还尝试在适配器 class 中实现逻辑,但是当我调用 API 时,我得到一个空白屏幕。

请帮我解决问题。

I want to make the output like this image

这是我的适配器Class

public class ChatConversationAdapter extends 
RecyclerView.Adapter<ChatConversationAdapter.ChatConversationViewHolder> {

private static final int VIEW_TYPE_MESSAGE_SENT = 1;
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;

private List<Datum> data;
private Context mContext;

// constructor
public ChatConversationAdapter(List<Datum> data, Context mContext) {
    this.data = data;
    this.mContext = mContext;
}

@Override
public int getItemCount() {
    return data.size();
}

@Override
public int getItemViewType(int position) {
    Datum dataItem = data.get(position);

    if (dataItem.getOriginatorId()=="8") return VIEW_TYPE_MESSAGE_SENT;
    else return VIEW_TYPE_MESSAGE_RECEIVED;
}

@Override
public ChatConversationViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
    if(viewType==VIEW_TYPE_MESSAGE_SENT){
        return new ChatConversationViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_message_sent,parent,false));
    }
    else{
        return new ChatConversationViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_message_received,parent,false));
    }
}

@Override
public void onBindViewHolder(ChatConversationViewHolder holder, int 
position) {

    switch (holder.getItemViewType()) {
        case VIEW_TYPE_MESSAGE_SENT:
           holder.messageText.setText(data.get(position).getMsg());

holder.timeText.setText(data.get(position).getCreatedAt().getFormatTime());
            break;

        case VIEW_TYPE_MESSAGE_RECEIVED:

holder.nameText.setText(data.get(position).getOriginator().getFullName());

holder.profileImage.setTag(data.get(position).getOriginator().getAvatar());
            holder.messageText.setText(data.get(position).getMsg());

holder.timeText.setText(data.get(position).getCreatedAt().getFormatTime());
    }
}

public class ChatConversationViewHolder extends RecyclerView.ViewHolder {
    TextView messageText, timeText, nameText;
    ImageView profileImage;

    public ChatConversationViewHolder(View itemView) {
        super(itemView);
        messageText = itemView.findViewById(R.id.text_message_body);
        timeText = itemView.findViewById(R.id.text_message_time);
        nameText = itemView.findViewById(R.id.text_message_name);
        profileImage = itemView.findViewById(R.id.image_message_profile);
    }
}
}

这是我的主要内容Activity

public class MsgChatActivity extends AppCompatActivity {

MsgHistoryAPIService msgHistoryAPIService;
RecyclerView recyclerView;
ChatConversationAdapter chatAdapter;
List<Datum> data = new ArrayList<>();

String frId_TV, owner_type_TV, subject_TV;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_msg_chat);

    msgHistoryAPIService = 
    RestClient.getClient().create(MsgHistoryAPIService.class);
    recyclerView = (RecyclerView) 
    findViewById(R.id.reyclerview_message_list);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    chatAdapter = new ChatConversationAdapter(new ArrayList<Datum>(),this);
    recyclerView.setAdapter(chatAdapter);

    frId_TV = "1";
    owner_type_TV = "1";
    subject_TV = "Message";

    chatHistoryData();
}

private void chatHistoryData() {
        final MsgHistoryRequest msgHistoryRequest = new MsgHistoryRequest(
        frId_TV,
        owner_type_TV,
        subject_TV
        );

        Call<MsgHistoryResponse> call = 
msgHistoryAPIService.chatHistory(token_key,
                msgHistoryRequest);
        call.enqueue(new Callback<MsgHistoryResponse>() {
            @Override
            public void onResponse(Call<MsgHistoryResponse> call, Response<MsgHistoryResponse> response) {
                Toast.makeText(MsgChatActivity.this, "" +response.body().getStatus() , Toast.LENGTH_LONG).show();

                data.addAll(response.body().getData());
                Toast.makeText(MsgChatActivity.this, "" + data.size(), Toast.LENGTH_LONG).show();
                chatAdapter.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<MsgHistoryResponse> call, Throwable t) {
                Toast.makeText(MsgChatActivity.this, "please try again" , Toast.LENGTH_LONG).show();
            }
        });
    }
}

已更新主要内容activity

   public class MsgChatActivity extends AppCompatActivity {

    MsgHistoryAPIService msgHistoryAPIService;
    RecyclerView recyclerView;
    ChatConversationAdapter chatAdapter;
    List<Datum> data = new ArrayList<>();

    String frId_TV, owner_type_TV, subject_TV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_msg_chat);

        msgHistoryAPIService = RestClient.getClient()
        .create(MsgHistoryAPIService.class);
        recyclerView = (RecyclerView) 
        findViewById(R.id.reyclerview_message_list);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        chatAdapter = new ChatConversationAdapter(data, this);
        recyclerView.setAdapter(chatAdapter);

        frId_TV = "1";
        owner_type_TV = "1";
        subject_TV = "Message";

        chatHistoryData();
    }


    private void chatHistoryData() {
            final MsgHistoryRequest msgHistoryRequest = new  
    MsgHistoryRequest(
            frId_TV,
            owner_type_TV,
            subject_TV
            );

            Call<MsgHistoryResponse> call = msgHistoryAPIService
            .chatHistory( token_key,
                    msgHistoryRequest);
            call.enqueue(new Callback<MsgHistoryResponse>() {
                @Override
                public void onResponse
            (Call<MsgHistoryResponse> call, 
            Response<MsgHistoryResponse> response) {
                    Toast.makeText(MsgChatActivity.this, "" 
            +response.body().getStatus() , Toast.LENGTH_LONG).show();

                    data.addAll(response.body().getData());
                    Toast.makeText(MsgChatActivity.this, "" 
                    + data.size(), Toast.LENGTH_LONG).show();
                    chatAdapter.notifyDataSetChanged();
                }

                @Override
                public void onFailure(Call<MsgHistoryResponse> call, 
                Throwable t) {

                    Toast.makeText(MsgChatActivity.this, 
                    "please try again" , Toast.LENGTH_LONG).show();
                }
            });
       }
   }

更新适配器Class

    public class ChatConversationAdapter extends 
    RecyclerView.Adapter<ChatConversationAdapter
    .ChatConversationViewHolder> {

    private static final int VIEW_TYPE_MESSAGE_SENT = 1;
    private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;

    private List<Datum> data;
    private Context mContext;

    // constructor
    public ChatConversationAdapter(List<Datum> data, Context mContext) {
        this.data = data;
        this.mContext = mContext;
    }


    // item count
    @Override
    public int getItemCount() {
        return data.size();
    }


    //Determines the appropriate ViewType according to the sender 
      of the message

    @Override
    public int getItemViewType(int position) {
        Datum dataItem = data.get(position);

        if (dataItem.getOriginatorId()=="8")
            return VIEW_TYPE_MESSAGE_SENT;
        else
            return VIEW_TYPE_MESSAGE_RECEIVED;
    }


    // Inflates the appropriate layout according to the ViewType.
    //create view holder

    @Override
    public ChatConversationViewHolder onCreateViewHolder
    (ViewGroup parent, int viewType) {

        View v;
        if(viewType==VIEW_TYPE_MESSAGE_SENT){
            v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_message_sent, parent, false);
        }
        else{

            v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_message_received, parent, false);
        }

        return new ChatConversationViewHolder(v, mContext, data);
    }


    // bind view holder

    @Override
    public void onBindViewHolder(ChatConversationViewHolder holder, 
    int position) {

        switch (holder.getItemViewType()) {
            case VIEW_TYPE_MESSAGE_SENT:
                holder.messageText.setText(data.get(position).getMsg());
                holder.timeText.setText(data.get(position)
                .getCreatedAt().getFormatTime());
                break;

            case VIEW_TYPE_MESSAGE_RECEIVED:
                holder.nameText.setText(data.get(position)
                .getOriginator().getFullName());

                holder.profileImage.setTag(data.get(position)
                .getOriginator().getAvatar());

                holder.messageText.setText(data.get(position).getMsg());

                holder.timeText.setText(data.get(position)
                .getCreatedAt().getFormatTime());
        }
    }


    // VIEW HOLDER
        public class ChatConversationViewHolder extends 
        RecyclerView.ViewHolder 
   {
        TextView messageText, timeText, nameText;
        ImageView profileImage;

        public ChatConversationViewHolder(View itemView, Context mContext, 
        List<Datum> data) {
            super(itemView);
            messageText = itemView.findViewById(R.id.text_message_body);
            timeText = itemView.findViewById(R.id.text_message_time);
            nameText = itemView.findViewById(R.id.text_message_name);
            profileImage = 
            itemView.findViewById(R.id.image_message_profile);
        }
    }
}

试试这个

@Override
     public ChatConversationViewHolder onCreateViewHolder(ViewGroup 
     parent,int viewType){
 if(viewType==VIEW_TYPE_MESSAGE_SENT){
    View v = LayoutInflater.from(viewGroup.getContext())
         .inflate(R.layout.item_message_sent, parent, false);
}
else{

    View v = LayoutInflater.from(viewGroup.getContext())
         .inflate(R.layout.item_message_received, parent, false);
    }

    return new ChatConversationViewHolder(v, mContext, data);
  }

public void onBindViewHolder(ChatConversationViewHolder holder, int
                         position){

if(data.get(position).getOriginatorId()=="8")
{
    holder.messageText.setText(data.get(position).getMsg());

    holder.timeText.setText(data.get(position).getCreatedAt().getFormatTime());
}
else
{
    holder.nameText.setText(data.get(position).getOriginator().getFullName());

    holder.profileImage.setTag(data.get(position).getOriginator().getAvatar());
    holder.messageText.setText(data.get(position).getMsg());

    holder.timeText.setText(data.get(position).getCreatedAt().getFormatTime());
}


 }