Kivy RecycleView自定义viewclass传入数据未正常生效问题求助
问题核心原因
- RecycleView未正确关联布局:你直接调用
add_widget(RVContainer())的写法是错误的,应该将RVContainer实例赋值给RecycleView的layout_manager属性,否则RecycleView无法将数据映射到对应布局的子控件上。 - 自定义控件属性未做动态绑定: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
相关产品推荐
相关产品推荐

