Прежде всего вы больше не используете ListView, так как он устарел, kivy рекомендует использовать RecycleView, концепция похожа на ListView, есть поле данных, которое представляет собой список словарей, где словарь - это свойства, которые виджетиспользует представление получает для создания каждого элемента.
Предполагая, что пользовательский виджет уже имеет его, вы должны предоставить все свойства, которые могут быть изменены списком, в примере есть 3 свойства: source_image, titleи сообщение.
from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
Builder.load_string('''
<CustomWidget@BoxLayout>:
source_image: ""
title: ""
message: ""
orientation: 'horizontal'
Image:
source: root.source_image
size_hint_x: 1
BoxLayout:
size_hint_x: 2
orientation: 'vertical'
Label:
text: root.title
size: self.texture_size
size_hint_y: None
Label:
text: root.message
<View>:
viewclass: 'CustomWidget'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
''')
class View(RecycleView):
def __init__(self, **kwargs):
super(View, self).__init__(**kwargs)
self.data = [{'source_image': "heart.png", 'title': "title{}".format(i), 'message': "message"} for i in range(100)]
if __name__ == '__main__':
runTouchApp(View())