仿微信聊天列表之RecyclerView多布局
仿微信聊天列表之RecyclerView多布局
最近在做关于聊天的项目,需要用到RecyclerView多布局,然而在网上却没有比较详细的讲解,于是萌生了自己写一篇的念头,可能写的不好,不喜勿喷。转载请标明出处,原创不易效果图不废话直接先上效果图:
![效果图]( {
implementation 'androidx.recyclerview:recyclerview:1.2.1'
}
```
接下来,我们需要创建一个数据模型来存储聊天消息的信息:
```javapublic class ChatMessage {
private String content;
private int type; //0: 文本,1: 图片,2: 视频 public ChatMessage(String content, int type) {
this.content = content;
this.type = type;
}
public String getContent() {
return content;
}
public int getType() {
return type;
}
}
```
RecyclerView的配置
在布局文件中,我们需要创建一个RecyclerView,并且设置其Adapter:
```xml android:layout_width="match_parent" android:layout_height="match_parent" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> ``` ```javapublic class ChatAdapter extends RecyclerView.Adapter private List public ChatAdapter(List this.chatMessages = chatMessages; } @Override public int getItemViewType(int position) { return chatMessages.get(position).getType(); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType ==0) { // 文本消息 return new TextViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_text, parent, false)); } else if (viewType ==1) { // 图片消息 return new ImageViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false)); } else { // 视频消息 return new VideoViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_video, parent, false)); } } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { ChatMessage chatMessage = chatMessages.get(position); if (holder instanceof TextViewHolder) { ((TextViewHolder) holder).bindData(chatMessage.getContent()); } else if (holder instanceof ImageViewHolder) { ((ImageViewHolder) holder).bindData(chatMessage.getContent()); } else { // 视频消息 ((VideoViewHolder) holder).bindData(chatMessage.getContent()); } } @Override public int getItemCount() { return chatMessages.size(); } } ``` 多布局的实现 在上面的代码中,我们使用了RecyclerView的getItemViewType方法来确定每个消息类型的布局。然后,我们使用onCreateViewHolder方法来创建不同的ViewHolder,并且使用onBindViewHolder方法来绑定数据。 ```javapublic class TextViewHolder extends RecyclerView.ViewHolder { public TextViewHolder(@NonNull View itemView) { super(itemView); // ... } public void bindData(String content) { // ... } } public class ImageViewHolder extends RecyclerView.ViewHolder { public ImageViewHolder(@NonNull View itemView) { super(itemView); // ... } public void bindData(String content) { // ... } } public class VideoViewHolder extends RecyclerView.ViewHolder { public VideoViewHolder(@NonNull View itemView) { super(itemView); // ... } public void bindData(String content) { // ... } } ``` 总结 通过上面的代码,我们可以实现一个仿微信聊天列表的RecyclerView多布局。我们使用了RecyclerView的getItemViewType方法来确定每个消息类型的布局,并且使用onCreateViewHolder和onBindViewHolder方法来绑定数据。 当然,这只是一个基本的例子,你可能需要根据自己的需求进行调整和扩展。