Python 3.x Kivy RecycleView:获取当前视图中所有数据项的索引

Python 3.x Kivy RecycleView:获取当前视图中所有数据项的索引,python-3.x,kivy,Python 3.x,Kivy,我需要获取Kivy RecycleView小部件中当前查看的所有数据项的索引。我想显示许多图像小部件,为其渲染纹理并将其应用于它们。为了节省内存,如果这些纹理不再在视图中,我需要删除它们。我尝试使用并根据自己的需要对其进行修改: class SelectableImage(RecycleDataViewBehavior, Image): def refresh_view_attrs(self, rv, index, data): #Catch and handle the

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

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\u view\u attrs()仅在向视图中添加新的图像小部件时触发。因此,我只能知道最后一个图像是什么,但无法知道是否还有其他图像。为此,我还需要知道哪个小部件从视图中消失了。RecycleView小部件中是否有任何功能可用于获取此类信息?也许有一个函数会在视图更改时被调用?

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

1.解决方案 自己计算所有图像小部件的位置,并将其与滚动条的位置进行比较,以获得当前显示的小部件。 这是相当骇客和回收视图已经这样做了内部。因此,我将节省不必要的计算并避免这种方法

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

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))

我希望这能澄清一些事情

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

1.解决方案 自己计算所有图像小部件的位置,并将其与滚动条的位置进行比较,以获得当前显示的小部件。 这是相当骇客和回收视图已经这样做了内部。因此,我将节省不必要的计算并避免这种方法

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

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))
我希望这能澄清一些事情