动态地向Recycler视图添加多个视图
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态地向Recycler视图添加多个视图相关的知识,希望对你有一定的参考价值。
我正在创建一个聊天应用程序,我需要根据聊天页面中的messageType填充不同的Xml文件,其中显示与特定用户的所有对话。示例如果messageType是图像我想填充不同的xml,如果messageType是视频我想填充不同的xml文件,类似地,文本和音频每次都有不同的xml文件。但是在我的代码中,我在onCreateViewHolder方法中填充了一个常见的xml。从模型类中检索messageType。
有什么帮助怎么做?
提前致谢 !!
您可以通过为每个messageType
使用不同的“项目视图类型”值来执行此操作。这个逻辑的根是适配器的getItemViewType()
回调:
@Override
public int getItemViewType(int position) {
if (isImage(position)) {
return R.layout.layout_for_image;
} else if (isVideo(position) {
return R.layout.layout_for_video;
} else {
// and so on...
}
}
我们在这里使用一个技巧:getItemViewType()
只关心你返回int
;它并不关心实际的int值是什么,因此我们使用布局ID作为返回值。这很好,因为这意味着你不必定义额外的常量或跟踪0
使用哪种视图类型,以及1
等。
您还需要为每种视图类型创建不同类型的ViewHolder
。传递给此方法的viewType
参数将具有从getItemViewType()
返回的任何值,并且由于我们返回了布局ID,因此我们可以膨胀我们得到的任何值。当然,我们仍然必须将它传递到正确的ViewHolder
,但它仍然使事情变得更容易:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(viewType, parent, false);
switch (viewType) {
case R.layout.layout_for_image: return new ImageViewHolder(itemView);
case R.layout.layout_for_video: return new VideoViewHolder(itemView);
...
}
}
最后一块是绑定:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
switch (holder.getItemViewType()) {
case R.layout.layout_for_image:
bindImage(holder, position);
break;
case R.layout.layout_for_video:
bindVideo(holder, position);
break;
...
}
}
覆盖getViewType(int index)并返回对象类型的不同值,然后在onCreateViewHolder上获取它并用不同的ViewHolders扩展正确的视图,onBindViewHolder将返回相同类型的viewholder,用于equals viewTypes。
以上是关于动态地向Recycler视图添加多个视图的主要内容,如果未能解决你的问题,请参考以下文章
Recycler视图在android studio中未显示一张卡片视图
我似乎无法将我的Kotlin Recycler多视图代码整理出来