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

带有SnapHelper装饰的RecyclerView

谭修竹
2023-03-14

当我用SnapHelper将一个照片库实现为RecyclerView时,我有一个案例。有些照片(全屏宽度的照片)是“粘”在一起的。我想添加一些装饰,所以它在项目之间的空白,但只有当一个开始嘲笑否则我想要一张照片采取整个宽度。我试过:

在创建自定义装饰时,我设法将我的装饰画出屏幕,这样它就只显示在滚动上,但是当重写ondraw()时,它是不可见的--隐藏在下一张照片下,而当我重写ondrawover()时,下一张照片的边缘在Divider下。我正在玩添加填充到照片,并将其重置在回收器的空闲状态,但随后照片跳了一点。

我还想在每一张照片之间添加‘虚拟’项目,这将起到分割器的作用,并迫使回收器滚动两个位置每次,但似乎有更好的解决方案。

共有1个答案

夹谷阳夏
2023-03-14

使用ItemDecoration是正确的,但是应该重写的方法是getItemOffsets(),而不是onDraw/onDrawover。它允许您在项目周围添加空间。

class LinearHorizontalSpacingDecoration(@Px private val innerSpacing: Int) :
    RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        super.getItemOffsets(outRect, view, parent, state)

        val itemPosition = parent.getChildAdapterPosition(view)

        outRect.left = if (itemPosition == 0) 0 else innerSpacing / 2
        outRect.right = if (itemPosition == state.itemCount - 1) 0 else innerSpacing / 2
    }
}

16dp间隔的结果:

我写了一篇中等的文章,描述了使用RecyclerView和SnapHelper逐步实现这种旋转木马的过程,如果您需要更多的细节(例如:如何实现缩放效果)。

 类似资料:
  • 问题内容: 我在装饰器传递变量时遇到问题。我可以通过以下装饰器语句来做到这一点: 但不幸的是,该声明不起作用。也许也许有更好的方法来解决此问题。 问题答案: 带参数的装饰器的语法有些不同-带参数的装饰器应返回一个函数,该函数将接受一个函数并返回另一个函数。因此,它实际上应该返回一个普通的装饰器。有点混乱吧?我的意思是: 在这里,你可以阅读有关该主题的更多信息-也可以使用可调用对象来实现此目的,这也

  • 我有一个RESTAPI服务器,使用NestJS和typeorm,控制器上有CRUD装饰器。我有一个用户实体 我知道用户名也是主列(我有更多列),但我需要通过用户名和角色(或id)来识别用户 我还有另一个实体(家庭信息) 但是,当我试图获取所有家庭信息(localhost:3000/api/family info)时,会出现一个错误“column familyinfonentity.parent\u

  • 问题内容: globalList = [] class MyList: def init(self): self._myList = [1, 2, 3] 结果: 我面临的问题是mL1.myList.append(4)和mL1.myList.extend([5,6,“ eight”,“ IX”])不会修改mL1对象中的_myList属性。我该如何解决该问题? 问题答案: 我为类对象定义了方法appe

  • 我有一个小项目,用一个类包装另一个类的对象。修饰类实现了一个接口,但装饰类没有实现它。我很好奇它仍然是装饰模式还是其他模式,在我的项目中“装饰”类应该被称为包装器而不是装饰器。 我已经检查了iluwatar github存储库(https://github.com/iluwatar/java-design-patterns/tree/master/decorator/src/main/java/c

  • 问题 你想写一个装饰器,既可以不传参数给它,比如 @decorator , 也可以传递可选参数给它,比如 @decorator(x,y,z) 。 解决方案 下面是9.5小节中日志装饰器的一个修改版本: from functools import wraps, partial import logging def logged(func=None, *, level=logging.DEBUG,

  • 问题内容: 我了解在Swift中所有变量都必须设置一个值,并且通过使用可选参数,我们可以将变量设置为初始值。 我不明白的是,用a设置变量的作用是什么,因为我的印象是这会“取消包装”来自可选值的值。我认为通过这样做,您可以保证在该变量中有一个要解包的值,这就是在IBActions上使用它的原因。 简而言之,当您执行以下操作时,要初始化的变量是什么: 为何/何时执行此操作? 问题答案: 在类型声明中,