You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy RecycleView自定义viewclass传入数据未正常生效问题求助

问题核心原因

  1. RecycleView未正确关联布局:你直接调用add_widget(RVContainer())的写法是错误的,应该将RVContainer实例赋值给RecycleView的layout_manager属性,否则RecycleView无法将数据映射到对应布局的子控件上。
  2. 自定义控件属性未做动态绑定:RecycleView是在viewclass实例的__init__方法执行完成后,才会将data里的字段赋值给对应属性。你在__init__中直接把初始空属性值传给子控件,后续属性更新时子控件不会同步变化,所以一直显示默认值。

修正代码

view.py 部分需要修改的类如下:

class PostRV(RecycleView):
    def __init__(self, **var_args):
        super(PostRV, self).__init__(**var_args)
        self.data = [
            {'date': 'a date', 'time': 'a time', 'name': 'a name'},
            {'date': 'another date', 'time': 'another time', 'name': 'another name'}
        ]
        # 替换原来的add_widget写法,指定布局管理器
        self.layout_manager = RVContainer()
        self.size_hint = 1, 1
        self.viewclass = Post
class Post(AnchorLayout):
    date = StringProperty('')
    time = StringProperty('')
    name = StringProperty('')
    def __init__(self, **var_args):
        super(Post, self).__init__(**var_args)
        self.anchor_y = 'center'
        self.anchor_x = 'center'
        self.size_hint = 1, None
        self.height = '110dp'
        # 实例化子控件
        self.post_container = PostContainer()
        self.add_widget(self.post_container)
        # 绑定属性变化,自动同步到子控件
        self.bind(
            date=self.setter("post_container.date"),
            time=self.setter("post_container.time"),
            name=self.setter("post_container.name")
        )
class PostContainer(GridLayout):
    date = StringProperty('')
    time = StringProperty('')
    name = StringProperty('')
    def __init__(self, **var_args):
        super(PostContainer, self).__init__(**var_args)
        self.cols = 2
        self.padding = '12dp'
        self.size_hint = (None, None)
        self.width = Window.size[0] / 1.05
        self.height = '100dp'
        # 实例化子控件
        self.shell_one = PostShellOne()
        self.add_widget(self.shell_one)
        self.add_widget(PostShellTwo())
        # 绑定属性同步与画布更新
        self.bind(
            date=self.setter("shell_one.date"),
            time=self.setter("shell_one.time"),
            name=self.setter("shell_one.name"),
            pos=self.update_rect, 
            size=self.update_rect
        )
        with self.canvas.before:
            Color(1, 1, 1, .7)
            self.rect = RoundedRectangle(size=self.size, pos=self.pos, radius=[10])
    def update_rect(self, *args):
        self.rect.pos = self.pos
        self.rect.size = self.size
        self.width = Window.size[0] / 1.05
class PostShellOne(GridLayout):
    date = StringProperty('')
    time = StringProperty('')
    name = StringProperty('')
    def __init__(self, **var_args):
        super(PostShellOne, self).__init__(**var_args)
        self.rows = 3
        self.name_label = Label(color=(0, 0, 0, 1))
        self.date_label = Label(color=(0, 0, 0, 1))
        self.time_label = Label(color=(0, 0, 0, 1))
        self.add_widget(self.name_label)
        self.add_widget(self.time_label)
        self.add_widget(self.date_label)
        # 绑定属性变化同步更新Label文本
        self.bind(
            name=lambda inst, val: setattr(self.name_label, "text", val),
            date=lambda inst, val: setattr(self.date_label, "text", val),
            time=lambda inst, val: setattr(self.time_label, "text", val)
        )

其余代码保持原有逻辑即可,修改完成后运行就能正常显示data中传入的文本内容。


内容的提问来源于stack exchange,提问作者Taylor St Jean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:45:02