我需要开发一个标签选择器,就像Foursquare用于品味的标签选择器,以及Flipboard用于“寻找新主题”的标签选择器。
我在github看到了这个图书馆Foursquare-CollectionPicker。
但是,它使用线性布局,这会在滚动时降低许多子视图的性能。
因此,我需要使用recyclerview。任何人都可以建议如何使用recyclerview复制这个?我的问题是,对于recyclerview中的每一行,列数可能会有所不同,具体取决于每行中子视图的大小/数量(在本例中为标记)。
谢谢。
答案 0 :(得分:0)
您需要编写自己的布局管理器,看看这些博客: http://wiresareobsolete.com/2014/09/building-a-recyclerview-layoutmanager-part-1/ http://simpleandstupid.com/2015/05/01/recyclerview-and-its-custom-layoutmanager/
答案 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),那么您根本不需要任何自定义代码。
(伪代码)
您将 RecylerView 与 GridLayoutManager 一起使用(导入 androidx.recyclerview.widget.GridLayoutManager)
你的适配器有一个类型(所以不同的 viewType 可以膨胀不同的 ViewHolders)。
你可以像这样初始化你的网格布局:
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 中显示“广告”:您可以在此处查看(它已经更新了一段时间,但代码仍然有效)。