Recyclerview предоставляет гибкую модель для просмотра выбранных разделов больших наборов данных. Он направлен на предотвращение снижения производительности, которое может произойти при создании большого количества виджетов для отображения многих элементов данных.
Представление создается путем обработки данных, а именно — списка словарей, и использует эти словари для создания экземпляров класса View по мере необходимости. Его дизайн основан на шаблоне MVC (Model-view-controller).
- Модель: модель формируется данными, которые вы передаете через список словарей
- Представление: представление разделено на макеты (layers) и представлениям (Views) и реализовано с помощью адаптеров
- Контроллер: контроллер определяет логическое взаимодействие и реализуется поведением Recyclerview
Это абстрактные классы, которые нельзя использовать напрямую. Конкретные реализации по умолчанию — это модель данных Recycle для модели, макет Recycle для представления и RecycleView для контроллера.
При создании экземпляра Recyclerview он автоматически создает представления и классы данных. Однако необходимо вручную создать классы компоновки и добавить их в Recyclerview.
Менеджер макетов автоматически создается как layout_manager при добавлении в качестве дочернего объекта Recyclerview. Аналогично при удалении. Требование заключается в том, что менеджер макетов должен содержаться как дочерний элемент где-то в дереве виджетов Recyclerview, чтобы можно было найти порт представления.
Минимальный пример может выглядеть примерно так:
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()
Для поддержки выбора в представлении можно добавить необходимые режимы следующим образом:
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()
Пожалуйста, смотрите examples/widgets/recycleview/basic_data.py файл для более полного примера.
Внимание: When views are re-used they may not trigger if the data remains the same.
API
class kivy.uix.recycleview.
RecycleViewBehavior
(**kwargs)
Основан на `builtins.object`
Поведение Recyclerview предоставляет поведенческую модель, на основе которой строится Recyclerview. Вместе они предлагают расширяемый и гибкий способ создания представлений с ограниченными окнами над большими наборами данных.
- data_model
- Модель данных, ответственная за поддержание набора данных.
- layout_manager
- Менеджер макетов, ответственный за размещение (позиционирование) видов в Recyclerview.
- refresh_from_data
- Это должно вызываться при изменении данных. Изменения данных обычно указывают на то, что все должно быть пересчитано с момента изменения исходных данных.
Этот метод автоматически привязывается к методу on_data_changed класса поведения модели данных Recycle и поэтому отвечает и принимает аргументы ключевого слова этого события.
Его можно вызвать вручную для запуска обновления.
- refresh_from_layout
- Это должно быть вызвано, когда макет изменяется или нуждается в изменении. Он обычно вызывается, когда параметр макета изменился,и поэтому макет должен быть пересчитан.
- refresh_from_viewport
- Это должно быть вызвано, когда видовой экран изменяется и отображаемые данные должны быть обновлены. Ни данные, ни макет не будут пересчитаны.
- view_adapter
- Адаптер, ответственный за предоставление представлений, представляющих элементы в наборе данных.
class kivy.uix.recycleview.
RecycleView
(**kwargs)
Основан на: kivy.uix.recycleview.RecycleViewBehavior
, kivy.uix.scrollview.ScrollView
Recyclerview — это гибкий вид для предоставления ограниченного окна в большой набор данных.
- add_widget
- Добавляет новый виджет в качестве дочернего элемента
- data
- Данные, используемые текущим адаптером представления. Это список dict, ключи которого сопоставляются с соответствующими именами свойств класса представления.
- key_viewclass
- key_viewclass is an AliasProperty that gets and sets the key viewclass for the current layout_manager.
- viewclass
- Класс представления, используемый текущим layout_manager. Возвращает и задает класс, используемый для создания отдельных элементов, представленных в представлении.
от