Recycleview doubt (Dynamically generating widgets inside view)

32 views
Skip to first unread message

Bruno Aguiar

unread,
Oct 22, 2017, 9:22:41 PM10/22/17
to Kivy users support

Hi, everyone. I'm trying to implement a Recycleview in which some widgets appear depending on the value passed by the Recycleview data dict.
I'm not able to reference the value passed by the data dictionary in python, though in kv it seems to work. But, as the widgets need to be generated dynamically, could someone show me how to do it?
Here's an example:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout

from kivy.properties import StringProperty


kv
= """
<Row@BoxLayout>:
    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 1
        Rectangle:
            size: self.size
            pos: self.pos
    value: ''
    Label:
        text: root.value
    CampoDado:
        valor: root.value


<CampoDado>:
    valor: ''
    Button:
        text: root.valor

<Test>:
    canvas:
        Color:
            rgba: 0.3, 0.3, 0.3, 1
        Rectangle:
            size: self.size
            pos: self.pos
    rv: rv
    orientation: 'vertical'
    GridLayout:
        cols: 3
        rows: 2
        size_hint_y: None
        height: dp(108)
        padding: dp(8)
        spacing: dp(16)
        Button:
            text: 'Populate list'
            on_press: root.populate()
        Button:
            text: 'Sort list'
            on_press: root.sort()
        Button:
            text: 'Clear list'
            on_press: root.clear()
        BoxLayout:
            spacing: dp(8)
            Button:
                text: 'Insert new item'
                on_press: root.insert(new_item_input.text)
            TextInput:
                id: new_item_input
                size_hint_x: 0.6
                hint_text: 'value'
                padding: dp(10), dp(10), 0, 0
        BoxLayout:
            spacing: dp(8)
            Button:
                text: 'Update first item'
                on_press: root.update(update_item_input.text)
            TextInput:
                id: update_item_input
                size_hint_x: 0.6
                hint_text: 'new value'
                padding: dp(10), dp(10), 0, 0
        Button:
            text: 'Remove first item'
            on_press: root.remove()
    RecycleView:
        id: rv
        scroll_type: ['bars', 'content']
        scroll_wheel_distance: dp(114)
        bar_width: dp(10)
        viewclass: 'Row'
        RecycleBoxLayout:
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'
            spacing: dp(2)
"""


Builder.load_string(kv)


class Test(BoxLayout):

   
def populate(self):
       
self.rv.data = [{'value': 'teste'+ str(x)}
                       
for x in range(50)]

   
def sort(self):
       
self.rv.data = sorted(self.rv.data, key=lambda x: x['value'])

   
def clear(self):
       
self.rv.data = []

   
def insert(self, value):
       
self.rv.data.insert(0, {'value': value or 'default value'})

   
def update(self, value):
       
if self.rv.data:
           
self.rv.data[0]['value'] = value or 'default new value'
           
self.rv.refresh_from_data()

   
def remove(self):
       
if self.rv.data:
           
self.rv.data.pop(0)

   
# def gerarinputs(self, value):
   
#     if self.rv.data

class CampoDado(BoxLayout):
    valor
= StringProperty('')
   
def __init__(self, mvalor=valor, **kwargs):
       
super(CampoDado, self).__init__(**kwargs)
       
self.mvalor = mvalor.get(self)
       
print(self.mvalor)
       
if self.mvalor == 'teste1':
           
print('nada escrito')
       

class TestApp(App):
   
def build(self):
       
return Test()


if __name__ == '__main__':
   
TestApp().run()

Reply all
Reply to author
Forward
0 new messages