[Kivy] RecycleViewのデータをソートする

RecycleViewのデータへのソートについて

 RecycleViewに表示したデータを追加、削除を繰り替えしているとデータの並びが乱れるため、データを見やすくするために並べ替え(ソート)をおこないたいと思う場合があります。RecycleViewのデータは、RecycleViewのdataに辞書データをリストにした形で入っており、リストと同じ方法でソートがおこなうことが可能です。

 今回は、RecycleViewのデータをソートする方法について紹介します。ソート処理は、kivyの機能では無く、Pythonのsortedによっておこないます。

RecycleViewのデータへのソート処理

 RecycleViewのデータは、sorted関数により以下のように並び替えることができます。下の例ではsorted関数によってRecycleViewのデータ(self.ids.rv.data)に対して関数sort_by_text2で指示した並び替えをおこない、その結果をRecycleViewのデータに入れています。RecycleViewに表示されるデータは、データを変更されたタイミングで変更されます。

 今回、sort_by_text2で指定した内容は、リスト内の辞書データから’text2’をそれぞれ取得して、その値の順番にリストを並び替えるというものです。sorted関数については、Pythonの公式資料などで確認してください.


    def on_button_press(self):
        def sort_by_text2(x):
            return x['text2']

        self.ids.rv.data = sorted(self.ids.rv.data, key=sort_by_text2)

サンプルプログラム

 以下のサンプルプログラムは、実行するとRecycleViewに左側列のデータが昇る順になるように並べた2列のデータが表示されます(左図)。画面内のソートボタンを押すと、右図のように右側列のデータが昇る順になるように並び替えられます。

# -*- 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
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty

kivy.require('2.2.0')

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

Builder.load_string('''

<MainD>
    BoxLayout:
        orientation: 'vertical'
        size: root.size
        padding: 20

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

        Button:
            size_hint_y: 0.2
            text: 'Sort'
            on_press: root.on_button_press()

<RVBox@BoxLayout>:
    text1: ''
    text2: ''
    Label:
        text: root.text1
        size_hint_x: None
        width: 100
    Label:
        text: root.text2
        size_hint_x: None
        width: 100
''')


class MainD(Widget):

    def __init__(self, **kwargs):
        super(MainD, self).__init__(**kwargs)
        data = [
            {'text1': 'data1', 'text2': 'data4'},
            {'text1': 'data2', 'text2': 'data3'},
            {'text1': 'data3', 'text2': 'data2'},
            {'text1': 'data4', 'text2': 'data1'}
            ]

        self.ids.rv.data = data

    def on_button_press(self):
        def sort_by_text2(x):
            return x['text2']

        self.ids.rv.data = sorted(self.ids.rv.data, key=sort_by_text2)


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をコピーしました