0

嗨,我开发了使用RecyclerView的twilio聊天。之后,我通过改变视图类型来实现RecyclerView中的窗体视图和调用屏幕作为聊天消息项目。在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

+0

请从'Adapter'发布更多的代码,这样我们就可以告诉你这是否是正确的做法。 –

+0

@BartekLipinski我添加了适配器完整代码 – yathavan

回答

0

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