【问题标题】:Kivy RecycleView: Get indices of all data items that are currently in viewKivy RecycleView:获取当前视图中所有数据项的索引
【发布时间】:2017-12-26 03:38:30
【问题描述】:

我需要获取当前在 Kivy RecycleView 小部件中查看的所有数据项的索引。我想显示许多我渲染纹理并将其应用于它们的图像小部件。为了节省内存,如果这些纹理不再可见,我需要删除它们。我尝试使用Kivy RecycleView example 并根据我的需要对其进行修改:

class SelectableImage(RecycleDataViewBehavior, Image):
    def refresh_view_attrs(self, rv, index, data):
        #Catch and handle the view changes
        #print in view
        print(index)
        #call initial function of image class
        return super(SelectableImage, self).refresh_view_attrs(rv, index, data)

这里的问题是 refresh_view_attrs() 仅在新的 Image 小部件添加到视图时触发。因此,我只能知道最后一张图片是什么,但如果还有其他图片,我就不知道了。为此,我还需要知道哪个小部件从视图中消失了。 RecycleView 小部件中是否有任何功能可用于获取此类信息?也许有一个函数会在视图发生变化时被调用?

【问题讨论】:

    标签: python-3.x kivy


    【解决方案1】:

    好的,我为我的问题找到了三种可能的解决方案:

    1。解决方案

    自己计算所有Image小部件的位置,并与滚动条的位置进行比较,得到当前显示的小部件。 这很 hacky,RecycleView 已经在内部做到了。因此我会节省不必要的计算并避免这种方法。

    2。解决方案

    使用 RecycleView 的 view_adapter 属性的 get_visible_view(index) 函数。这将返回与索引关联的当前可见视图。如果它返回 None,则与 index 关联的视图现在不可见。例如,它是这样称呼的:

    self.myRecycleView.view_adapter.get_visible_view(index)
    

    您可以遍历数据列表的整个长度并检查每个项目(列表中的索引)是否当前显示。

    3。解决方案

    我最喜欢的方法:使用 layout_manager 属性的 get_view_index_at(pos) 来检查给定坐标处的视图索引。通过这种方式,您可以检查哪个项目位于 RecycleLayout 小部件的顶部以及哪个项目位于底部。不过,您需要使用坐标变换。示例:

    #get position at top center of RecycleView (upper limit)
    pos = self.myRecycleView.to_local(self.myRecycleView.center_x, self.myRecycleView.height)
    #check which items collides with the given position    
    print(self.myRecycleView.layout_manager.get_view_index_at(pos))
    

    我希望这能解决一些问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 2022-11-21
      相关资源
      最近更新 更多