Created
November 15, 2017 11:12
-
-
Save gottadiveintopython/791a3d79f7537640334822922f0cf02d to your computer and use it in GitHub Desktop.
recycleviewの内部動作検証
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from random import sample | |
from string import ascii_lowercase | |
from kivy.config import Config | |
Config.set('modules', 'inspector', '') | |
from kivy.app import App | |
from kivy.lang import Builder | |
from kivy.uix.boxlayout import BoxLayout | |
from kivy.factory import Factory | |
class CustomRecycleBoxLayout(Factory.RecycleBoxLayout): | |
def add_widget(self, widget, *args, **kwargs): | |
print('add_widget:', str(widget.uid), args, kwargs) | |
return super().add_widget(widget, *args, **kwargs) | |
def remove_widget(self, widget, *args, **kwargs): | |
print('remove_widget:', str(widget.uid), args, kwargs) | |
return super().remove_widget(widget, *args, **kwargs) | |
kv = """ | |
<Row@BoxLayout>: | |
canvas.before: | |
Color: | |
rgba: 0.5, 0.5, 0.5, 1 | |
Rectangle: | |
size: self.size | |
pos: self.pos | |
value: '' | |
ToggleButton: | |
text: root.value | |
<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' | |
CustomRecycleBoxLayout: | |
id: id_boxlayout | |
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': ''.join(sample(ascii_lowercase, 6))} | |
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): | |
print('----insert----') | |
print('Rowの順番', [(str(child.uid), child.value, ) for child in self.ids.id_boxlayout.children]) | |
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) | |
class TestApp(App): | |
def build(self): | |
return Test() | |
if __name__ == '__main__': | |
TestApp().run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment