【问题标题】:Set span for items in GridLayoutManager using SpanSizeLookup使用 SpanSizeLookup 为 GridLayoutManager 中的项目设置跨度
【发布时间】:2014-11-11 16:12:37
【问题描述】:

我想用部分标题实现类似网格的布局。想想https://github.com/TonicArtos/StickyGridHeaders

我现在做什么:

mRecyclerView = (RecyclerView) view.findViewById(R.id.grid);
mLayoutManager = new GridLayoutManager(getActivity(), 2);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch(mAdapter.getItemViewType(position)){
                    case MyAdapter.TYPE_HEADER:
                        return 1;
                    case MyAdapter.TYPE_ITEM:
                        return 2;
                    default:
                        return -1;
                }
            }
        });

mRecyclerView.setLayoutManager(mLayoutManager);

现在常规项目和标题的跨度大小都是 1。我该如何解决这个问题?

【问题讨论】:

  • 这个实现对我来说是正确的。如果您的 mAdapter.getItemViewType(position) 返回正确的值,您是否调试过?
  • "1" 似乎是比 "-1" 更安全的默认值。
  • 我是新手。对我来说,这个链接帮助了我3 RecyclerView Infinite Scroll Examples

标签: android android-support-library android-recyclerview gridlayoutmanager


【解决方案1】:

问题是标题的跨度大小应该是 2,而常规项目的跨度大小应该是 1。 所以正确的实现是:

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch(mAdapter.getItemViewType(position)){
                    case MyAdapter.TYPE_HEADER:
                        return 2;
                    case MyAdapter.TYPE_ITEM:
                        return 1;
                    default:
                        return -1;
                }
            }
        });

【讨论】:

  • 获取跨度大小方法确定您的单元格将采用的跨度宽度,而不是 col 行的数量!!
  • 当跨越第一个项目时,它会弄乱下一个项目的高度。它适用于任何其他项目。有什么想法吗?
  • @RonnyShibley 针对您上述问题的任何解决方案......我也面临同样的问题,标题后的第一项未显示,其他项均按要求显示
  • 这不行。
【解决方案2】:

标题的跨度应等于整个列表的跨度计数。

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
           switch(mAdapter.getItemViewType(position)){
                    case MyAdapter.TYPE_HEADER:
                        return mLayoutManager.getSpanCount();
                    case MyAdapter.TYPE_ITEM:
                        return 1;
                    default:
                        return -1;
                }
    }
});

【讨论】:

  • 为什么没有人链接到实际文档:developer.android.com/reference/kotlin/androidx/recyclerview/… 因此,这个答案对我来说似乎比目前接受的答案更准确。也许创建一个具有跨度计数的 const 变量并将其用于GridLayoutManager 构造函数和getSpanSize 方法以避免getSpanCount 对每个标题的调用。
【解决方案3】:

回答我自己的问题: 设置适配器后覆盖 Activity 中的 getSpanSizeLookup()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多