Android:具有不同元素大小、可调整大小、可拖动和水平分页的主屏幕

Android: Home screen with different element sizes, resizable, draggable and horizontal pagination

我正在开发一个新的应用程序,它将有一个 2 x 4 网格的主屏幕。当有可用空间时,每个项目都可以调整为 2 (1x2) 或 4 (2x2) 个单元格。网格还必须包含空白空间,以便可以调整其他元素的大小。假设您可能只有 6 个项目,2 个空格应显示为空白。 要更改项目的位置,可以将其拖放到所需位置,这也适用于分页,因此可以将其拖到另一个页面并放到那里或与相应页面的某些项目交换。或多或少像是 Android 的主屏幕,上面的所有图标都可以拖放到其他页面。 我不确定我是否必须使用任何类型的 RecyclerView 或手动处理每个视图,但仍然不确定应该如何完成? 请检查下面的模型以获取参考它应该是什么样子。

为此,我会使用 RecyclerViewGridLayoutManager,并使用 GridLayoutManager.SpanSizeLookup 设置单元格大小。

通过这样做,您还可以使用 RecyclerView 附带的 ItemTouchHelper 来处理大部分拖放逻辑。

(此外,您确实应该提供您所做的任何尝试的代码)

编辑: 行跨度

据我所知,解决行跨度问题的方法有3种

  1. 使用第三方库
  2. 编写自己的 LayoutManager
  3. 更改 ´onBindViewHolder` 中项目的高度(这可能是我会做的)
// Some model class
data class Item(value: String, rowSpan: Int, columnSpan: Int)

// With this lookup to handle the columns
val spanSizeLookup: GridLayoutManager.SpanSizeLookup = 
    object : GridLayoutManager.SpanSizeLookup() {
        override fun getSpanSize(position: Int) = items[position].columnSpan
    }

// ...and this adapter that handles the height
class Adapter : RecyclerView.Adapter() {

    // ...

    fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val rows = items[position].rowSpan
        // Update height based on rows
    }
}