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がおこなえることが確認できます。
![](https://tannipat.blog/wp-content/uploads/2023/12/kin_test_recycleview1.webp)
# -*- 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()