Как я могу сохранить свое состояние Kivy ToggleButton при прокрутке с использованием RecycleView? - PullRequest
0 голосов
/ 16 октября 2019

Если я создаю список ToggleButton и помещаю их в RecycleView, переключение одной ToggleButton приводит к тому, что ToggleButton из-за пределов видимости изменяет состояние путем прокрутки в и из вида. Я неправильно реализовал свой RecycleView?

Мой RecycleView работает должным образом, если я использую кнопки вместо ToggleButtons.

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

1 Ответ

0 голосов
/ 16 октября 2019

Вот модификация вашего кода, которая выполняет обновление 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()
...