2016-02-07 3 views
1

В контейнере виджет у меня есть ListView с адаптером:Kivy: Обновление ListView данных с ListAdapter или DictAdapter не меняет текст кнопки

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 и она изменяется аналогично (то есть, если значения являются dictdict ев себя, изменение этих dict с), ничего не происходит.

ответ

2

Событие изменения срабатывает только если детали append Е.Д., insert Е.Д., remove д, pop Е.Д., slice д, sort ред и т.д., но не если идентичности пунктов, не меняются. В таком случае, как вопрос, нужно вручную отправить событие изменения. Если adapter является ListAdapter, это можно сделать так:

adapter.data.prop.dispatch(adapter.data.obj()) 

В случае DictAdapter следующее уместно:

adapter.data.prop.dispatch(adapter.data.obj) 

(это только стоило мне день моей жизни Надежда кто-то. другое находит это полезным ...)

+0

Хи, спасибо за этот ответ, надеемся, что это сэкономит мне день! У меня остался один глупый вопрос ... где я должен выполнить команду adapter.data.prop.dispatch? – zwep