如何使用具有两种视图类型的 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());
}
}
我正在尝试从服务器获取聊天数据并显示它。我创建了两个 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());
}
}