使用RecycleView滚动时如何保持Kivy ToggleButton的状态?

问题描述 投票:0回答:1

如果我创建一个ToggleButtons列表并将其放在RecycleView中,则切换一个ToggleButton会导致视图外ToggleButtons通过滚动视图和视图而改变状态。我是否正确实施了RecycleView?

如果我使用Button而不是ToggleButtons,我的RecycleView会按预期工作。

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.properties import StringProperty,NumericProperty
Builder.load_string("""
<MyLayout>:
    orientation: 'vertical'
    spacing: 10
    RV:
<RV>:
    viewclass: 'RecycleViewRow'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'

<RecycleViewRow>:
    orientation: 'horizontal'
    ToggleButton:
        text: root.text
""")

class MyLayout(BoxLayout):
    pass

class RecycleViewRow(BoxLayout):
    text = StringProperty()

class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'text': "Button " + str(x+1)} for x in range(30)]

class MainscreenApp(App):
    def build(self):
        return MyLayout()

if __name__=="__main__":
    MainscreenApp().run()
python kivy togglebutton
1个回答
0
投票

这里是您的代码的修改,可以进行self.data更新:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.properties import StringProperty

Builder.load_string("""
<MyLayout>:
    orientation: 'vertical'
    spacing: 10
    RV:
        id: rv
<RV>:
    viewclass: 'RecycleViewRow'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'

<RecycleViewRow>:
    orientation: 'horizontal'
    ToggleButton:
        id: tb
        text: root.text
        state: root.state
        on_release: app.root.ids.rv.adjust_data(root)
""")

class MyLayout(BoxLayout):
    pass

class RecycleViewRow(BoxLayout):
    text = StringProperty()
    state = StringProperty('normal')

class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'text': "Button " + str(x+1), 'state': "normal"} for x in range(30)]

    def adjust_data(self, rvRow):
        for d in self.data:
            if d['text'] == rvRow.text:
                d['state'] = rvRow.ids.tb.state
                rvRow.state = rvRow.ids.tb.state
                break

class MainscreenApp(App):
    def build(self):
        return MyLayout()

if __name__=="__main__":
    MainscreenApp().run()
© www.soinside.com 2019 - 2024. All rights reserved.