动态地向Recycler视图添加多个视图

问题描述 投票:0回答:2

我正在创建一个聊天应用程序,我需要根据聊天页面中的messageType填充不同的Xml文件,其中显示与特定用户的所有对话。示例如果messageType是图像我想填充不同的xml,如果messageType是视频我想填充不同的xml文件,类似地,文本和音频每次都有不同的xml文件。但是在我的代码中,我在onCreateViewHolder方法中填充了一个常见的xml。从模型类中检索messageType。

有什么帮助怎么做?

提前致谢 !!

android android-studio android-recyclerview recycler-adapter recyclerview-layout
2个回答
1
投票

您可以通过为每个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;

        ...
    }
}

0
投票

覆盖getViewType(int index)并返回对象类型的不同值,然后在onCreateViewHolder上获取它并用不同的ViewHolders扩展正确的视图,onBindViewHolder将返回相同类型的viewholder,用于equals viewTypes。

© www.soinside.com 2019 - 2024. All rights reserved.