I saw different posts talking about that: HERE and THERE.
But they are complex solutions when I just want to understand what is the exact line that make the changement. I have the access to the RecycleView
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.factory import Factory as F
from kivy.properties import ListProperty
KV = '''
<Item>:
RecycleView:
data: app.data
viewclass: 'Row'
RecycleBoxLayout:
id: recycle_view
orientation: 'vertical'
size_hint: 1, None
height: self.minimum_height
default_size_hint: 1, None
default_size: 0, dp(40)
'''
def _on_text(instance, value):
recycle_view = instance.app.screen.ids["recycle_view"]
print(recycle_view,"value that I want to update in the recycle_view:",value)
#recycle_view.data ? I don't know how to access the data and change it !
class Row(F.TextInput):
def on_kv_post(self, base_widget):
super().on_kv_post(base_widget)
self.app = MDApp.get_running_app()
self.bind(text=_on_text)
class Application(MDApp):
data = ListProperty()
def build(self):
self.data = [
{'index': i, 'text': 'hello {}'.format(i)}
for i in range(40)
]
self.screen = Builder.load_string(KV)
return self.screen
if __name__ == "__main__":
Application().run()
Okay, I find out that I missed the fact that I was playing with RecycleBoxlaout
and not RecycleView
.
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.factory import Factory as F
from kivy.properties import ListProperty
KV = '''
<Item>:
RecycleView:
data: app.data
viewclass: 'Row'
RecycleBoxLayout:
id: recycle_boxlayout
orientation: 'vertical'
size_hint: 1, None
height: self.minimum_height
default_size_hint: 1, None
default_size: 0, dp(40)
'''
def _on_text(instance, value):
instance.app.screen.data[instance.index]["text"] = value
class Row(F.TextInput):
def on_kv_post(self, base_widget):
super().on_kv_post(base_widget)
self.app = MDApp.get_running_app()
self.counter = -1
self.bind(text=_on_text)
class Application(MDApp):
data = ListProperty()
def build(self):
self.data = [
{'index': i, 'text': 'hello {}'.format(i)}
for i in range(40)
]
self.screen = Builder.load_string(KV)
return self.screen
if __name__ == "__main__":
Application().run()