Table Of Contents
RecycleView¶
バージョン 1.10.0 で追加.
The RecycleView provides a flexible model for viewing selected sections of large data sets. It aims to prevent the performance degradation that can occur when generating large numbers of widgets in order to display many data items.
The view is generatad by processing the data
, essentially
a list of dicts, and uses these dicts to generate instances of the
viewclass
as required. Its design is based on the
MVC (Model-view-controller)
pattern.
- Model: The model is formed by
data
you pass in via a list of dicts. - View: The View is split across layout and views and implemented by...
- Controller: The controller is implemented by
RecycleViewBehavior
.
These are abstract classes and cannot be used directly. The default concrete
implementation is the
RecycleDataModel
for the model, the
RecycleLayout
and ... for view, and the
RecycleView
for the controller.
When a RecycleView is instantiated, it automatically creates the views and data classes. However, one must manually create the layout classes and add them to the RecycleView.
A layout manager is automatically created as a
layout_manager
when added as the child of the
RecycleView. Similarly when removed. A requirement is that the layout manager
must be contained as a child somewhere within the RecycleView’s widget tree so
the view port can be found.
A minimal example might look something like this:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
Builder.load_string('''
<RV>:
viewclass: 'Label'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
''')
class RV(RecycleView):
def __init__(self, **kwargs):
super(RV, self).__init__(**kwargs)
self.data = [{'text': str(x)} for x in range(100)]
class TestApp(App):
def build(self):
return RV()
if __name__ == '__main__':
TestApp().run()
In order to support selection in the view, you can add the required behaviours as follows:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.label import Label
from kivy.properties import BooleanProperty
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
Builder.load_string('''
<SelectableLabel>:
# Draw a background to indicate selection
canvas.before:
Color:
rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)
Rectangle:
pos: self.pos
size: self.size
<RV>:
viewclass: 'SelectableLabel'
SelectableRecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
multiselect: True
touch_multiselect: True
''')
class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
RecycleBoxLayout):
''' Adds selection and focus behaviour to the view. '''
class SelectableLabel(RecycleDataViewBehavior, Label):
''' Add selection support to the Label '''
index = None
selected = BooleanProperty(False)
selectable = BooleanProperty(True)
def refresh_view_attrs(self, rv, index, data):
''' Catch and handle the view changes '''
self.index = index
return super(SelectableLabel, self).refresh_view_attrs(
rv, index, data)
def on_touch_down(self, touch):
''' Add selection on touch down '''
if super(SelectableLabel, self).on_touch_down(touch):
return True
if self.collide_point(*touch.pos) and self.selectable:
return self.parent.select_with_touch(self.index, touch)
def apply_selection(self, rv, index, is_selected):
''' Respond to the selection of items in the view. '''
self.selected = is_selected
if is_selected:
print("selection changed to {0}".format(rv.data[index]))
else:
print("selection removed for {0}".format(rv.data[index]))
class RV(RecycleView):
def __init__(self, **kwargs):
super(RV, self).__init__(**kwargs)
self.data = [{'text': str(x)} for x in range(100)]
class TestApp(App):
def build(self):
return RV()
if __name__ == '__main__':
TestApp().run()
Please see the examples/widgets/recycleview/basic_data.py file for a more complete example.
- TODO:
- Method to clear cached class instances.
- Test when views cannot be found (e.g. viewclass is None).
- Fix selection goto.
警告
When views are re-used they may not trigger if the data remains the same.
-
class
kivy.uix.recycleview.
RecycleViewBehavior
(**kwargs)[ソース]¶ ベースクラス:
builtins.object
RecycleViewBehavior provides a behavioral model upon which the
RecycleView
is built. Together, they offer an extensible and flexible way to produce views with limited windows over large data sets.See the module documentation for more information.
-
data_model
¶ The Data model responsible for maintaining the data set.
data_model is an
AliasProperty
that gets and sets the current data model.
-
layout_manager
¶ The Layout manager responsible for positioning views within the
RecycleView
.layout_manager is an
AliasProperty
that gets and sets the layout_manger.
-
refresh_from_data
(*largs, **kwargs)[ソース]¶ This should be called when data changes. Data changes typically indicate that everything should be recomputed since the source data changed.
This method is automatically bound to the
on_data_changed
method of theRecycleDataModelBehavior
class and therefore responds to and accepts the keyword arguments of that event.It can be called manually to trigger an update.
-
refresh_from_layout
(*largs, **kwargs)[ソース]¶ This should be called when the layout changes or needs to change. It is typically called when a layout parameter has changed and therefore the layout needs to be recomputed.
-
refresh_from_viewport
(*largs)[ソース]¶ This should be called when the viewport changes and the displayed data must be updated. Neither the data nor the layout will be recomputed.
-
view_adapter
¶ The adapter responsible for providing views that represent items in a data set.
view_adapter is an
AliasProperty
that gets and sets the current view adapter.
-
-
class
kivy.uix.recycleview.
RecycleView
(**kwargs)[ソース]¶ ベースクラス:
kivy.uix.recycleview.RecycleViewBehavior
,kivy.uix.scrollview.ScrollView
RecycleView is a flexible view for providing a limited window into a large data set.
See the module documentation for more information.
-
data
¶ The data used by the current view adapter. This is a list of dicts whose keys map to the corresponding property names of the
viewclass
.data is an
AliasProperty
that gets and sets the data used to generate the views.
-
key_viewclass
¶ key_viewclass is an
AliasProperty
that gets and sets the key viewclass for the currentlayout_manager
.
-
viewclass
¶ The viewclass used by the current layout_manager.
viewclass is an
AliasProperty
that gets and sets the class used to generate the individual items presented in the view.
-