from kivy.app import Appfrom kivy.lang import Builderfrom kivy.uix.recycleview import RecycleViewfrom kivy.uix.recycleview.views import RecycleDataViewBehaviorfrom kivy.uix.label import Labelfrom kivy.properties import BooleanPropertyfrom kivy.uix.recycleboxlayout import RecycleBoxLayoutfrom kivy.uix.behaviors import FocusBehaviorfrom kivy.uix.recycleview.layout import LayoutSelectionBehavior

Builder.load_string(''':
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (1, 0, 1, .5) if self.selected else (0, 0, 0, 1)
        Rectangle:
            pos: self.pos
            size: self.size:
    viewclass: 'SelectableLabel'
    SelectableRecycleBoxLayout:
        canvas:
            Color:
                rgba: (1, 1, 0,1)
            Rectangle:
                pos: self.pos
                size: self.size
        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 False
        if self.collide_point(*touch.pos) and self.selectable:
            try:
                for one_color in self.parent.children:
                    if one_color.selected:
                        one_color.selected = False
                    if self.parent.parent.data[self.index]["text"]==one_color.text:
                        self.parent.parent.data_selected[0]=one_color.text
                        one_color.selected=True
            except:
                passclass RV(RecycleView):
    def __init__(self,data_range=range(2000,2100),**kwargs):
        super(RV, self).__init__(**kwargs)
        self.data_selected=[0]
        self.data = [{'text': str(x)} for x in data_range]class TestApp(App):
    def build(self):
        return RV()if __name__ == '__main__':
    TestApp().run()