【问题标题】:How to determine positioning for RecyclerView with multiple view holders如何确定具有多个视图持有者的 RecyclerView 的定位
【发布时间】:2017-08-22 15:23:21
【问题描述】:

在回收站视图中创建多个视图持有者没有问题。我遇到的问题是确定标题和项目的定位。

我正在创建一个图库应用,我想将我的专辑名称作为标题,并为每个专辑放置 8 张图片。因此,您将有一个带有专辑标题的标题,然后是该专辑中的 8 张图片。然后是专辑标题和该专辑中的 8 张图片的下一个标题。并继续该计划。如果图片少于 8 张,我希望将其留空,直到下一个标题开始。

我有两个 ArrayList 从中获取数据。专辑和媒体。

我正在尝试在我的适配器的 getItemViewType 中设置类型,但不知道如何像上面提到的那样设置它们。让我困惑的是试图为每个相册设置多个数组列表和未知数量的图片的位置。

再一次,这不是我见过的许多关于在回收站视图中设置多个视图持有者的问题。我有这个概念。我的问题是确定视图持有者的位置。

这就是我的创建和绑定视图看起来如何提供一些上下文

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == ALBUM_TYPE) {
        return new AlbumHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view, parent, false));
    } else if (viewType == HEAD_TYPE) {
        return new HeadHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.header_text, parent, false));
    } else {
        return new MediaHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_photo, parent, false));
    }

}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof AlbumHolder) {
        Album m = albums.get(position);
        ((AlbumHolder)holder).bindView(m, position);
    } else if (holder instanceof HeadHolder) {
        if (sortingMode == SortingMode.FOLDER) {
            Album m = albums.get(position);
            ((HeadHolder)holder).bindView(m.getName(), position);
        } else {
            String m = sortListYear.get(position);
            ((HeadHolder)holder).bindView(m, position);
        }

    } else {
        Media m = media.get(position);
        ((MediaHolder)holder).bindView(m, position);
    }

}

ALBUM_TYPE 不用于我要问的这个问题。只是 HEAD_TYPE 和 MEDIA_TYPE。

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    在这里考虑 2 个对象 Media 和 Head

    您可以做的是创建另一个 ArrayList 并按照您希望它在 recyclerview 中显示/使用的顺序将数据(Media 或 Head)添加到这个新的 arraylist(Object) 中。

    ArrayList<Object> objList = new ArrayList<>();
    objList.add(new Head("Header1");
    objList.add(new Media("/img1"));
    objList.add(new Media("/img2"));
    objList.add(new Media());//no image, for blank entry
    objList.add(new Head("Header2"));
    objList.add(new Media("/img3"));
    objList.add(new Media());
    objList.add(new Media());
    

    现在您可以在 getItemViewType 中使用 instanceof 了。这里的位置由 objList 的索引决定。

    【讨论】:

    • 我喜欢这种方法,但我正在努力创建 objList。我正在尝试嵌套循环,但似乎无法使其工作。关于它的外观的任何提示。我的媒体有一种方法可以查看它属于哪个专辑(头)。
    • 你能分享一些关于你如何尝试创建 objList 的代码吗?这样建议会更容易。
    【解决方案2】:

    您有两个单独的 ArrayList 用于媒体和专辑。

     ArrayList<Object> mediaList = new ArrayList();
    
    ArrayList<Object> albumList = new ArrayList();
    

    在您的场景中,您需要计算位置。

    让我们用一个例子来解决这个问题。 在您的getItemViewType 方法中,您已将媒体设置在第一组列表中,然后是专辑。即,recyclerview 的总大小为 10,其中前 8 行将是媒体,最后两行将是专辑。

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
    int currentPosition = 0;
    if ((mediaList.size() - 1) >= position) {
    //Since media list is loaded first...
        currentPosition = position;
    } else {
        //Since we are loading the album next we need to take from here...
       currentPosition = position - mediaList.size();
    }
    
    
     if (holder instanceof MediaHolder) {
            Media m = media.get(currentPosition);
            ((MediaHolder)holder).bindView(m, currentPosition);
        } else if (holder instanceof AlbumHolder) {
            Album m = albums.get(currentPosition);
            ((AlbumHolder)holder).bindView(m, currentPosition);
        }
    
    }
    

    如果您在以下行中遇到任何ArrayIndexOutOfBound 异常,

    currentPosition = position - mediaList.size();
    

    请进行以下更改,

    currentPosition = (position - mediaList.size()) - 1;
    

    更多信息你可以参考这个link,在这个例子中我们已经实现了一个页脚,为此我也计算了位置。

    希望这有帮助:)

    【讨论】:

    • 似乎无法弄清楚 getItemViewType 方法会是什么样子才能完成这项工作。每张专辑也将是 8 个媒体。您说“recyclerview 的总大小为 10,前 8 行是媒体,后两行是专辑”,这是不正确的。如果最后两行是专辑,那么应该有 16 个媒体行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2021-12-04
    • 2021-01-17
    • 2021-07-19
    相关资源
    最近更新 更多