[Kivy] RecycleViewにデータを表示する

RecycleViewにデータを表示する

 RecycleViewは、Kivyで大量のデータ項目を効率よく表示するためののWidgetです。このWidgetを使用すると、複数の列を持つリストの表示が可能になります。

 今回は、単純にRecycleViewを定義してデータを追加するまでの作業と、表示するデータの追加・削除の方法について紹介します。

RecycleViewのデータの管理については以下の記事があります。

項目を選択可能なRecycleViewの作成については以下の記事があります。

RecyleViewにデータを表示する方法

 RecycleViewの定義では、ビュー(viewclass)とレイアウト(RecycleView Layouts)を指定します。ビューではデータ(モデル)を表示する部分の内容を、レイアウトではビューの体裁について記入します。

 RecycleViewに表示するデータには、dictをリストにしたものを使用します。RecycleViewは、そのデータの内必要なもの(画面に表示するデータに対してのみ作ることで、メモリ負荷の低減や処理の高速化を実現しているのだと思います)に必要なものに対してビュークラスのインスタンスを生成して、それらをレイアウトの中に表示します。

 RecycelViewにデータを表示するには、① RecycleViewを定義して、② RecycleViewに表示するデータを追加する必要があります。それぞれの作業について、以下で説明します。

1. RecycleViewを定義する。

 サンプルプログラムのviewclassでは、<RVBox@BoxLayout>(RvBoxクラス)を指定(viewclass: ‘RVBox’の部分)して、<RVBOX@BoxLayout>の中で2つのLabelにより項目を作成しています。それらのLabelのテキストには、root.text1、root.text2をしており、Recycleviewのモデルの中で必要なデータのtext1,text2の値が入力されたviewclassのインスタンス化したものが作成されます。

 RecycleBoxLayoutは、RecycleViewの体裁を指定する部分であり、viewclassで定義したものを載せる部分の指定をおこないます。サンプルプログラムでは、載せるviewclassのインスタンス化したものの高さ(minimum_heightにより最小の高さにする)や並べ方を指定しています。

        RecycleView:
            id: rv
            viewclass: 'RVBox'
            RecycleBoxLayout:
                size_hint_y: None
                height: self.minimum_height
                orientation: 'vertical'

<RVBox@BoxLayout>:
    text1: ''
    text2: ''
    Label:
        text: root.text1
    Label:
        text: root.text2

2. RecycleViewに表示するデータを追加する

 RecycleViewに表示するデータは、kivy.uix.recycleview.RecycleView.dataに入れます。dataは、辞書データをリストにしたものなので、以下のように定義したり、通常のリストに対しておこなうように追加(add)や削除(remove)をすることができます。
※ self.ids.rvにより、Kv LangageでidをrvにしたRecycleViewにアクセスしています。

 以下では、<RVBOX>のtext1とtext2に入れる値を指定しているので、辞書データは{‘text1’: ‘text1のテキスト’, ‘text2’: ‘text2のテキスト’}というものにしています。

    def __init__(self, **kwargs):
        super(MainD, self).__init__(**kwargs)
        self.ids.rv.data = [
            {'text1': '1', 'text2': '1'}, {'text1': '2', 'text2': '2'},
            {'text1': '3', 'text2': '3'}, {'text1': '4', 'text2': '4'}
            ]

        self.ids.rv.data.append({'text1': '5', 'text2': '5'})
        self.ids.rv.data.remove({'text1': '1', 'text2': '1'})

サンプルプログラム

 以下のサンプルプログラムは、RecycleViewにデータを表示したものです。プログラム内で、RecycleViewのdataには、データの追加や削除をおこなっており、実行した時に表示されるデータは、それらの処理をおこなった結果となっています。このことから、RecycleViewのdataはリストと同じようにappendやremoveがおこなえることが確認できます。

# -*- coding: utf-8 -*-

import kivy

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.config import Config

kivy.require('2.2.0')

Config.set('graphics', 'width', '250')
Config.set('graphics', 'height', '400')

Builder.load_string('''

<MainD>
    BoxLayout:
        size: root.size
        padding: 20

        RecycleView:
            id: rv
            viewclass: 'RVBox'
            RecycleBoxLayout:
                size_hint_y: None
                height: self.minimum_height
                orientation: 'vertical'

<RVBox@BoxLayout>:
    text1: ''
    text2: ''
    Label:
        text: root.text1
    Label:
        text: root.text2

''')


class MainD(Widget):

    def __init__(self, **kwargs):
        super(MainD, self).__init__(**kwargs)
        self.ids.rv.data = [
            {'text1': '1', 'text2': '1'}, {'text1': '2', 'text2': '2'},
            {'text1': '3', 'text2': '3'}, {'text1': '4', 'text2': '4'}
            ]

        self.ids.rv.data.append({'text1': '5', 'text2': '5'})
        self.ids.rv.data.remove({'text1': '1', 'text2': '1'})

class MainDApp(App):
    def __init__(self, **kwargs):
        super(MainDApp, self).__init__(**kwargs)
        self.title = 'RecycleView Test1'

    def build(self):
        return MainD()


if __name__ == '__main__':
    app = MainDApp()
    app.run()
タイトルとURLをコピーしました