如何更新 RecycleView Kivy

How to update RecycleView Kivy

这是我的第一个问题,很抱歉,如果屠杀它。

我正在制作一个应用程序,它将允许我工作中的其他人更有效地创建协议。

问题是,我正在尝试更新创建的 RecycleView,但由于某种原因它不起作用。网上的一些解决方案建议使用 .refresh_from_data() 方法,但是没有用,而且所有其他解决方案都太复杂(或者我太笨了)。

我有这个功能 - add_entry 将来自两个 TextInputs 的信息添加为协议列表中的字典。

目前我的 RecycleView 只显示数字,因为没有任何解决方案有效,实际上我什至很难制作 Recycle View。

这里是 Python 代码的相关部分:

class DrillingInfoPage(Screen):
    rod = 1
    dist = 3
    protocol = ListProperty() # {Rod:_,Distance:_,Proc:_,Depth:_}

    def add_entry(self, proc, depth): 
        self.protocol.append({'Rod': 0, 'Distance': 0, 'Proc': 0, 'Depth': 0})
        self.protocol[self.rod-1]['Proc'] = proc
        self.protocol[self.rod-1]['Depth'] = depth
        self.protocol[self.rod-1]['Rod'] = self.rod
        self.protocol[self.rod-1]['Distance'] = self.dist
        self.rod += 1
        self.dist += 3
        print(self.protocol)
        return self.protocol


class Profile(Screen):
    pass


class WindowManager(ScreenManager):
    pass


class ColorsPopup(Screen):
    popupWindow = None


class Recycle(RecycleView):
    def __init__(self, **kwargs):
        super(Recycle, self).__init__(**kwargs)
        self.data = [{'text': str(x)} for x in range(50)]


kv = Builder.load_file("my.kv")


class MyApp(App):
    def build(self):
        return kv


if __name__ == '__main__':
    MyApp().run()

这里是 KV 文件的相关部分:

<DrillingInfoPage>:
    name: 'third'
    BoxLayout:
        orientation: 'vertical'
        Label:
            size_hint: 1, .4
            text: 'Drilling Info Page'
        GridLayout:
            size_hint: 1, .1
            cols:3
            GridLayout:
                cols:2
                Label:
                    text: 'BG'
                TextInput:
                    id: start
                    multiline: False
            GridLayout:
                cols:2
                Label:
                    text: 'BG'
                TextInput:
                    id: end
                    multiline: False
            Button:
                text: 'Confirm'
                on_release: drilling_holes.text = 'BG' + start.text + ' -----> ' + 'BG' + end.text

        GridLayout:
            size_hint: 1, .1
            cols:3
            GridLayout:
                cols:2
                Label:
                    text: '%:'
                TextInput:
                    id: proc
                    multiline: False
            GridLayout:
                cols:2
                Label:
                    text: 'Depth:'
                TextInput:
                    id: depth
                    multiline: False
            Button:
                text: 'Add'
                on_release: root.add_entry(proc.text, depth.text)

        Label:
            id: drilling_holes
            size_hint: 1, .2
            text: ''

        Recycle:
            id: drilling_data
            data: self.data
            viewclass: 'Label'
            RecycleBoxLayout:
                default_size: None, '25dp'
                default_size_hint: 1, None
                size_hint_y: None
                height: self.minimum_height
                orientation: 'vertical'

        Label:
            size_hint: 1, .2
            text: ''
        GridLayout:
            size_hint: 1, .17
            cols:2
            Button:
                text: 'Go Back'
                on_release:
                    app.root.current = 'second'
                    root.manager.transition.direction = 'down'
            Button:
                text: 'Confirm'
                on_release:
                    app.root.current = 'last'
                    root.manager.transition.direction = 'up'

我已经尝试在 RecycleView class 以及 DrillingInfoPage class 中创建一些函数来刷新数据,但似乎没有任何效果。

我是 Python 的新手,尤其是 Kivy,因此希望有智慧的人能指导我正确的方向:)

Here how the screen itself looks right now, ideally it should be empty at first and pressing 'Add' button should add a new line

您只需将新信息添加到 RecycleViewdata 列表中。目前尚不清楚您要添加到 RecycleView 的确切内容,但您可以像这样在 add_entry() 方法中添加一行:

    self.ids.drilling_data.data.append({'text': proc})  # add new entry to data list

而且该方法不需要 return 语句