Kivy:使用 ListAdapter 或 DictAdapter 更新到 ListView 数据不会更改按钮文本
Kivy: Update to ListView data with ListAdapter or DictAdapter does not change button text
在容器小部件中,我有一个 ListView
适配器:
list_item_args_converter = \
lambda row_index, selectable: \
{'text': "[{}] {}: {}".format(row_index, selectable['t'], selectable['v']),
'size_hint_y': None, 'height': 25}
my_list_adapter = \
ListAdapter(data=my_data,
args_converter=list_item_args_converter,
selection_mode='single',
allow_empty_selection=False,
cls=ListItemButton)
self.list_view = ListView(adapter=my_list_adapter)
self.add_widget(self.list_view)
和my_data = [{'t':str(i), 'v':random.randint(1,10)} for i in range(5)]
。
我天真地假设 mv.list_view.adapter.data[0]['v'] = '42'
(其中 mv
是容器小部件)在列表上调度一个更改事件,从而将第一个列表视图按钮的文本更改为“[0] 0: 42
”。
然而什么也没发生。
同样,如果适配器是 DictAdapter
并且它被类似地更改(即,如果 dict
的值本身是 dict
,则更改这些 dict
s ), 没有任何反应。
仅当项目 append
ed、insert
ed、remove
d、pop
ed、slice
d、sort
ed 等,但如果项目的标识保持不变则不会。在类似问题的情况下,必须手动调度 change 事件。如果 adapter
是 ListAdapter
,可以这样做:
adapter.data.prop.dispatch(adapter.data.obj())
如果是 DictAdapter
,以下是合适的:
adapter.data.prop.dispatch(adapter.data.obj)
(这只花了我一天的时间。希望其他人觉得这很有用……)
在容器小部件中,我有一个 ListView
适配器:
list_item_args_converter = \
lambda row_index, selectable: \
{'text': "[{}] {}: {}".format(row_index, selectable['t'], selectable['v']),
'size_hint_y': None, 'height': 25}
my_list_adapter = \
ListAdapter(data=my_data,
args_converter=list_item_args_converter,
selection_mode='single',
allow_empty_selection=False,
cls=ListItemButton)
self.list_view = ListView(adapter=my_list_adapter)
self.add_widget(self.list_view)
和my_data = [{'t':str(i), 'v':random.randint(1,10)} for i in range(5)]
。
我天真地假设 mv.list_view.adapter.data[0]['v'] = '42'
(其中 mv
是容器小部件)在列表上调度一个更改事件,从而将第一个列表视图按钮的文本更改为“[0] 0: 42
”。
然而什么也没发生。
同样,如果适配器是 DictAdapter
并且它被类似地更改(即,如果 dict
的值本身是 dict
,则更改这些 dict
s ), 没有任何反应。
仅当项目 append
ed、insert
ed、remove
d、pop
ed、slice
d、sort
ed 等,但如果项目的标识保持不变则不会。在类似问题的情况下,必须手动调度 change 事件。如果 adapter
是 ListAdapter
,可以这样做:
adapter.data.prop.dispatch(adapter.data.obj())
如果是 DictAdapter
,以下是合适的:
adapter.data.prop.dispatch(adapter.data.obj)
(这只花了我一天的时间。希望其他人觉得这很有用……)