首页 > 解决方案 > 将动态结果(图像)拉入 RecycleView

问题描述

我正在将搜索结果(图像)加载到RecycleView. 看起来AsyncImage'ssource属性在运行时会拉取图像,这让我没有多少机会根据用户的输入来更改它。我正在使用RecycleView类来显示搜索结果,因此灵活性是关键。

示例代码:

from kivy.app import App
from kivy.uix.recycleview import RecycleView
from kivy.uix.image import AsyncImage
from kivy.properties import StringProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

LINK_HOLDER = ''


class WindowManager(ScreenManager):
    pass

class First(Screen):
    pass

class Second(Screen):
    rv_data = [{'text': 'random text here','source': LINK_HOLDER}]  # being assigned at run time ???

    '''
    links to use:
    https://www.dropbox.com/s/cku7lcyyikupyda/ruby.png?raw=1
    https://www.dropbox.com/s/nfkkt1b90p2g5qh/python.jpeg?raw=1
    https://www.dropbox.com/s/5840br37wwvymtr/julia.png?raw=1
    '''

class ImageAndTitle(BoxLayout):
    title = StringProperty()
    source = StringProperty()

class ExampleApp(App):

    def build(self):
        return load


load = Builder.load_string('''
WindowManager:
    First:
    Second:


<First>:
    name: 'first'
    FloatLayout:
        Button:
            text: 'Python'
            pos: 100, 300
            size_hint: None, None
            size: 100, 100
            on_press:
                global LINK_HOLDER
                LINK_HOLDER = 'https://www.dropbox.com/s/cku7lcyyikupyda/ruby.png?raw=1'
                app.root.current = 'second'
                root.manager.transition.direction = 'right'
        Button:
            text: 'Ruby'
            pos: 250, 300
            size_hint: None, None
            size: 100, 100
            on_press:
                global LINK_HOLDER
                LINK_HOLDER = 'https://www.dropbox.com/s/nfkkt1b90p2g5qh/python.jpeg?raw=1'
                app.root.current = 'second'
                root.manager.transition.direction = 'right'
        Button:
            text: 'Julia'
            pos: 450, 300
            size_hint: None, None
            size: 100, 100
            on_press:
                global LINK_HOLDER
                LINK_HOLDER = 'https://www.dropbox.com/s/5840br37wwvymtr/julia.png?raw=1'
                app.root.current = 'second'
                root.manager.transition.direction = 'right'

<ImageAndTitle>:
    Label:
        text: root.title
    AsyncImage:
        source: root.source

<Second>:
    name: 'second'
    GridLayout:
        cols: 2
        rows: 1
        BoxLayout:
            orientation: 'vertical'
            RecycleView:
                viewclass: 'ImageAndTitle'
                data: root.rv_data
                RecycleBoxLayout:
                    default_size_hint: 1, None
                    default_size: 100, 30
                    size_hint_y: None
                    height: self.minimum_height
                    orientation: 'vertical'

        BoxLayout:
            orientation: 'vertical'
            Label:
                text: 'five'
            Label:
                text: 'six'

''')


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

有没有办法做到这一点?

标签: pythonkivy

解决方案


该解决方案来自 Kivy 核心开发团队的一名成员,绰号 Turtle。诀窍是使用rv_data = ListProperty(allownone=True),然后我们可以rv_data根据需要动态修改/更改属性。


推荐阅读