在RecyclerView聊天窗口中实现多个布局

时间:2017-05-04 08:07:32

标签: android performance android-layout user-interface android-recyclerview

您好我使用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();
 }
}

这就是我想要的UI。 enter image description here

1 个答案:

答案 0 :(得分:0)

假设您正在使用ViewHolders,您的实现似乎是正确的。但是,一种改进是覆盖getItemViewType(int position)方法以返回每个元素视图类型(由其位置和calling变量给出)。这样,您就可以使用单个if句子替换代码中的switch句子。