动态地向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多视图代码整理出来

使用 WindowManager.addView 添加动态视图

在Recycler视图上添加图像视图时,Android导航抽屉动画滞后/减速