Android Recyclerview - 如何根据子大小每行使用不同的列数?

时间:2015-09-04 16:40:19

标签: java android android-recyclerview

我需要开发一个标签选择器,就像Foursquare用于品味的标签选择器,以及Flipboard用于“寻找新主题”的标签选择器。

我在github看到了这个图书馆Foursquare-CollectionPicker

但是,它使用线性布局,这会在滚动时降低许多子视图的性能。

因此,我需要使用recyclerview。任何人都可以建议如何使用recyclerview复制这个?我的问题是,对于recyclerview中的每一行,列数可能会有所不同,具体取决于每行中子视图的大小/数量(在本例中为标记)。

谢谢。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您可以在回收站视图中使用 FlexboxLayoutManager。您需要做的就是创建布局管理器,如下所示。当然也不要忘记将您自己的 recyclerAdapter 添加到 recycler 视图中。

FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(context);
layoutManager.setFlexWrap(FlexWrap.WRAP);
recyclerView.setLayoutManager(layoutManager);

https://android-developers.googleblog.com/2017/02/build-flexible-layouts-with.html

https://blog.devcenter.co/unboxing-the-flexboxlayout-a7cfd125f023

答案 2 :(得分:0)

如果您只需要一个改变列数的回收器视图(在 RecyclerView 中使用标准的 Google 提供的 GridLayoutManager),那么您根本不需要任何自定义代码。

(伪代码)

先决条件

  1. 您将 RecylerView 与 GridLayoutManager 一起使用(导入 androidx.recyclerview.widget.GridLayoutManager)

  2. 你的适配器有一个类型(所以不同的 viewType 可以膨胀不同的 ViewHolders)。

  3. 你可以像这样初始化你的网格布局:

private lateinit var layoutManager: GridLayoutManager
private val adapter = YourAdapter()

Activity#onCreate(...) {
   super.onCreate(savedInstance)
   setContentView(...)
   layoutManager = GridLayoutManager(this, 2) //defaults to two columns
   yourRecyclerView.layoutmanager = layoutManager //set it
   yourRecyclerView.adapter = adapter

   //Here goes the magic
}

魔法是什么?

像这样:

   layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int): Int {
                return when (adapter.getItemViewType(position)) {
                    adapter.viewTypeOneColumn -> 1
                    adapter.viewTypeTwoColumns -> 2
                    else -> -1
                }
            }
        }

这显然假设您有一个“视图类型”(任何类型)

它可以很简单:

class YourAdapter : ...  {
    internal val viewTypeOneColumn = 0
    internal val viewTypeTwoColumns = 1
     ...
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when(viewType) {
            viewTypeOneColumn -> ViewHolderForOneColumn(...)
            viewTypeTwoColumns -> ViewHolderForTwoColumns(...)
            else ->  throw IllegalArgumentException("You must supply a valid type for this adapter")
        }
    }

     override fun getItemViewType(position: Int): Int {
        return getItem(position).someThingThatClassifiesThem // this obviously depend on what you use to define what each item is...
    }
}

这就是您真正需要的。

我曾经创建了一个示例,用于在 RecyclerView 中显示“广告”:您可以在此处查看(它已经更新了一段时间,但代码仍然有效)。

https://github.com/Gryzor/GridToShowAds