Kivy recycleview not scrolling smoothly

I'm developing a music player mobile application using kivy2.0.0, in the app there is a playlist screen that consist of more than 100 mdboxlayout widget called 'MusicListItem'.

I have these 2 problems with the app:

  1. The scrolling part is not scrolling smoothly and sometimes select things when scrolling on android devices
  2. I want when I select a particular Item, a function to be called and change the icon of the MDIconButton of that selected item to 'pause'.

This is my .py file

from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.core.window import Window
from kivy.properties import StringProperty, ObjectProperty
from kivymd.theming import ThemableBehavior
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.screen import MDScreen
from kivymd.uix.behaviors import RectangularRippleBehavior
from kivy.clock import Clock

Builder.load_file('playlist.kv')

KV = """
#:import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManager:
    transition: FadeTransition()

    Playlist:
        name: "playlist screen"

"""

class Playlist(ThemableBehavior, MDScreen):
    rv = ObjectProperty()
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_once(self._finish_init)

    def music_list(self):
        return ['audio '+str(i) for i in range(1, 121)]

    def _finish_init(self, dt):
        self.set_list_musics()
        self.ids.rv.data[0]["icon"] = 'pause'

    def set_list_musics(self):
        """Builds a list of audios for the screen Playlist."""
        print(self.ids)

        def add_music_item(num, sura, secText, icon):
            self.ids.rv.data.append(
                {
                    "viewclass": "MusicListItem",
                    "number": num,
                    "text": sura,
                    "secondary_text": secText,
                    "icon": icon,
                    "callback": lambda x:x})
    
        for i in range(len(self.music_list())):
            music = self.music_list()
            add_music_item(str(i+1), music[i], '00:00:00', 'play')
         
    
class MusicListItem(ThemableBehavior, RectangularRippleBehavior, MDBoxLayout):
    text = StringProperty()
    secondary_text = StringProperty()
    number = StringProperty()
    icon = StringProperty()
    
    
class Mp3Player(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
       
    def build(self):
        self.theme_cls.primary_palette = "Purple"
        self.theme_cls.theme_style = "Dark"
        return Builder.load_string(KV)


if '__main__' == __name__:
    Mp3Player().run()

.kv file

#: import gch kivy.utils.get_color_from_hex

<Playlist>
    md_bg_color: gch("#5D1049")
        
    MDGridLayout:
        cols: 1
        
        MDToolbar:
            left_action_items: [["menu", lambda x: x]]
            right_action_items: [["magnify", lambda x: x]]
            elevation: 10
            md_bg_color: 75/255, 6/255, 54/255, 1
            title: 'Playlist'
            pos_hint: {'top':1}
                    
        MDBoxLayout:
            orientation: 'vertical'
           
            RecycleView:
                id: rv
                viewclass: 'MusicListItem'

                RecycleBoxLayout:
                    padding: dp(10)
                    default_size: None, dp(60)
                    default_size_hint: 1, None
                    size_hint_y: None
                    height: self.minimum_height
                    orientation: 'vertical'

     
<MusicListItem>
    size_hint_y: None
    padding: dp(14)
    height: dp(60)

    canvas:
        Color:
            rgba:
                self.theme_cls.divider_color
        Line:
            points: (root.x+dp(10), root.y, root.x+self.width-dp(10)-0, root.y)

    MDBoxLayout:
        orientation: "horizontal"
        pos_hint: {"center_x": .5, "center_y": .5}

        MDBoxLayout:
            orientation: 'horizontal'
            MDBoxLayout:
                orientation: 'vertical'
                size_hint_x: .2
              
                MDLabel:
                    text: root.number
                    font_style: "H6"
                    adaptive_height: True
                
                MDLabel:
                    size_hint_y: .3
                 
            MDBoxLayout:
                orientation: 'vertical'
             
                MDLabel:
                    text: root.text
                    font_style: "Subtitle2"
                    adaptive_height: True
    
                MDLabel:
                    text: root.secondary_text
                    font_style: "Caption"
                    theme_text_color: "Hint"
                    adaptive_height: True

            MDIconButton:
                icon: root.icon          
    

please any help is appreciated


Firstly, I found no scrolling issue.

Secondly, in order to select a specific item in RecycleView you need some button-like behavior in that specific item (viewclass) which will trigger some action when interacted with.

Thus your modified MusicListItem should now look like,

class MusicListItem(ThemableBehavior, RectangularRippleBehavior, ButtonBehavior, MDBoxLayout):
    text = StringProperty()
    secondary_text = StringProperty()
    number = StringProperty()
    icon = StringProperty()

    def on_release(self, *args):
        self.icon = "pause"
        print(f"Selected item no. {self.number}")

Just remember to trigger any action at instance level.