当前位置: 首页 > 知识库问答 >
问题:

删除回收器视图中最后一行空列中的额外项目装饰

訾旭
2023-03-14

我正在尝试删除空列项目装饰,如下图所示。我最初想在注释中使用下面的代码根据内容限制最后一行的跨距计数,但我没有成功。

以下是代码和图像的结果。

 val taskDatesView: RecyclerView = binding.taskDatesRecyclerView
    val manager = GridLayoutManager(context,10)
    taskDatesView.layoutManager = manager
    taskDatesView.adapter = taskDatesAdapter

    createTasksViewModel.taskDates.observe(viewLifecycleOwner) {
        it?.let(taskDatesAdapter::setTaskDates)
        val decoration = DividerItemDecoration(context, HORIZONTAL)
        taskDatesView.addItemDecoration(decoration)
        /*manager.spanSizeLookup = object :SpanSizeLookup(){
            override fun getSpanSize(position: Int): Int {
                val lastRowCount = (taskDatesAdapter.itemCount%10)
                if(position>taskDatesAdapter.itemCount -lastRowCount){
                    return lastRowCount
                }
                return 10
            }
        }*/
        

当我取消注释代码并运行应用程序时,结果如下:

任何代码参考或链接都会有所帮助。提前感谢。

共有1个答案

史商震
2023-03-14

在Custom Divider中,根据lastRowCount修改底部填充,它按预期工作。

下面是工作代码,结果还在代码中添加了注释,以便更好地理解

fun drawHorizontal(c: Canvas?, parent: RecyclerView) {
    val noOfColumns = 10
    val top = parent.paddingTop
    var bottom = parent.height - parent.paddingBottom
    val childCount = parent.childCount
    // values required not to draw the bottom for last empty columns
    val lastRowCount = childCount % noOfColumns
    val numOfRows = childCount / noOfColumns
    for (i in 0 until childCount) {
        val child = parent.getChildAt(i)
        val params = child.layoutParams as RecyclerView.LayoutParams
        // this can be optimized to calculate only once for every row
        val rowNumber = ((i + 1) / noOfColumns) + 1
        // Within every row after crossing the lastRowCount the bottom should not be extended
        if ((i * rowNumber) - (lastRowCount - 1) > 0) {
            bottom = (child.height * (numOfRows))
        }
        val left = child.right + params.rightMargin + mDivider.intrinsicHeight
        val right = left + mDivider.intrinsicWidth
        mDivider.setBounds(left, top, right, bottom)
        mDivider.draw(c!!)
    }
}

如果我们需要垂直和水平方向,使用上面和下面的代码

fun drawVertical(c: Canvas?, parent: RecyclerView){
    val dividerLeft = parent.paddingLeft
    val dividerRight = parent.width - parent.paddingRight
    val childCount = parent.childCount
    for (i in 0..childCount - 2) {
        val child: View = parent.getChildAt(i)
        val params = child.layoutParams as RecyclerView.LayoutParams
        val dividerTop: Int = child.getBottom() + params.bottomMargin
        val dividerBottom = dividerTop + mDivider.intrinsicHeight
        mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom)
        mDivider.draw(c)
    }
}
 类似资料:
  • 我正在使用回收器视图显示具有多个视图的项目。每当我启动应用程序时,就会显示一些空白。正好等于我的列表项。我提供了截图,请浏览一下。 我想我的代码没有问题。下面是我的代码RecycerView 适配器代码 请帮帮我。谢谢。

  • 这是不是意味着我没有刷新我的适配器还是什么? @重写公共void onDeleteClick(int position){FoodInfo selectedItem; 食物适配器 } 这是我删除项目后的删除方法,它仍然存在于我的回收视图中,并在firebase中消失 我必须离开这个页面并再次访问,然后它只显示与firebase完全相同的项目 有人帮忙吗?

  • 我以以下方式使用来显示在SQLite DB中更新的位置项列表。 这些项目被很好地删除,并在我滑动它们时更新。但是当我滑动删除最后一个项目时,它又出现在视图中。当我关闭应用程序并重新打开应用程序时,该项目已被删除。 但当项目被滑动以删除时,在该应用程序运行的实例中,即使滑动多次,该项目也不会从视图中删除。 refreshPlacesData() 我错过了什么吗?谢谢。 编辑:我尝试更新适配器而不是m

  • 我有一个活动,在创建时,我创建了五个文件,然后读取这些文件并添加到我的recyclerview中。我还在我的recyclerview中添加了滑动功能。当一个项目被滑动时,它删除了recycler视图中该位置的单元格,同时也删除了我创建的文件。我面临的问题是,假设在我的recyclerview中有5个项目1、2、3、4和5,我滑动鼠标删除1,包含1的文件被删除,但在我的recyclerview中,当

  • 我正在使用RecyclerView,并有一些动画,我可以在ViewHolder项目中放大一个相对布局。 注意:它不是添加/删除/插入动画。当用户在 ViewHolder 项中交互时,它将启动。因此,我在这里没有使用ItemAnimator。 动画工作正常,但它会在某个随机视图项中重新出现(最终状态)。我知道这是由于物品的重复使用,我也在清除动画,但这没有帮助。 我在节目里做这个 在onViewDe

  • 如何在swapCursor函数中实现回收器视图默认项添加/删除动画。notifyDataSetChanged()不会显示任何动画。