您好我使用RecyclerView开发了twilio聊天。之后,我通过更改视图类型实现表单视图并在RecyclerView内调用屏幕作为聊天消息项。
这是一种有效的方法吗?任何其他方式请建议我,谢谢。
这是我的代码:
if (viewType == SELF) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_item_user, parent, false);
} else if (viewType == formView) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_form_item, parent, false);
} else {
if (calling == true) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_calling_screen, parent, false);
} else {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_item_other, parent, false);
}
}
适配器完整代码:
class MessagesAdapter extends RecyclerView.Adapter < MessagesAdapter.ViewHolder > {
class ViewHolder extends RecyclerView.ViewHolder {
public TextView messagedata, msgTime;
public ImageView profileImg;
public Button answer;
public Button decline;
public RelativeLayout formLayout;
public ViewHolder(View view) {
super(view);
messagedata = (TextView) view.findViewById(R.id.messagechat);
msgTime = (TextView) view.findViewById(R.id.msg_time);
profileImg = (ImageView) view.findViewById(R.id.chat_profile_img);
answer = (Button) view.findViewById(R.id.call_answer);
decline = (Button) view.findViewById(R.id.call_decline);
formLayout = (RelativeLayout) view.findViewById(R.id.form_container);
if (buttonAvaliable) {
answer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calling = false;
Intent answer = new Intent(MainActivity.this, VideoActivity.class);
finish();
startActivity(answer);
}
});
decline.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calling = false;
int number = Integer.parseInt(String.valueOf(getAdapterPosition()));
finish();
startActivity(getIntent());
}
});
}
buttonAvaliable = false;
if (formAvaliable) {
formLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent formActivity = new Intent(MainActivity.this, UserEvaluationChat.class);
startActivity(formActivity);
}
});
}
formAvaliable = false;
}
}
public MessagesAdapter() {
}
@Override
public MessagesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView;
if (viewType == SELF) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_item_user, parent, false);
} else if (viewType == formView) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_form_item, parent, false);
formAvaliable = true;
} else {
if (calling == true) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_calling_screen, parent, false);
buttonAvaliable = true;
calling = false;
} else {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_item_other, parent, false);
}
calling = false;
}
return new ViewHolder(itemView);
}
@Override
public int getItemViewType(int position) {
Message message = mMessages.get(position);
String userId = String.valueOf(getSharedPref("userId") + "_user").toLowerCase().trim();
String author = String.valueOf(message.getAuthor()).toLowerCase().trim();
if (message.getAuthor().equals(userId)) {
return SELF;
}
if (!message.getAuthor().equals(userId) && message.getMessageBody().equals("patientevaluation__form")) {
return formView;
}
return position;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Message message = mMessages.get(position);
String messageText = String.format("%s", message.getMessageBody());
if (holder.getItemViewType() == formView) {
formAvaliable = true;
} else {
formAvaliable = false;
calling = false;
holder.messagedata.setTextSize(18);
holder.messagedata.setText(messageText);
}
}
@Override
public int getItemCount() {
return mMessages.size();
}
}
答案 0 :(得分:0)
假设您正在使用ViewHolders,您的实现似乎是正确的。但是,一种改进是覆盖getItemViewType(int position)
方法以返回每个元素视图类型(由其位置和calling
变量给出)。这样,您就可以使用单个if
句子替换代码中的switch
句子。