You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于其他类的变量更新加载Kivy RecycleView?

解决方案

你的问题核心是RecycleView在初始化时就执行了数据查询,而此时current_user和current_day_id还没更新到正确值。可以通过以下几个步骤解决:

1. 重构RecycleView,将数据加载逻辑抽为独立方法

把原来写在__init__里的数据库查询和数据赋值,移到一个单独的方法中,比如load_snapshots():

class SnapshotsRV(MDRecycleView):
    def __init__(self, **kwargs):
        super(SnapshotsRV, self).__init__(**kwargs)
        # 保存App实例引用,避免重复调用
        self.app = App.get_running_app()
        # 监听App的两个属性变化,自动触发数据刷新
        self.app.bind(current_user=self.load_snapshots)
        self.app.bind(current_day_id=self.load_snapshots)

    def load_snapshots(self, *args):
        # 只有当两个值都处于有效状态时才执行查询
        user = self.app.current_user
        day_id = self.app.current_day_id
        if user == 0 or day_id is None:
            self.data = []
            return

        # 数据库查询逻辑
        conn = sqlite3.connect("site.db")
        c = conn.cursor()
        c.execute("SELECT * FROM snapshot WHERE user_id=? AND day=?", (user, day_id))
        snapshots = c.fetchall()
        self.data = [{'text': snapshot[2]} for snapshot in snapshots]
        conn.close()

2. 在屏幕进入时主动触发数据加载

即使绑定了属性变化,最好在包含RecycleView的屏幕进入时,再主动调用一次load_snapshots(),确保数据是最新的。假设你的KV文件里这个屏幕叫DayScreen,可以在屏幕类里添加on_enter方法:

class DayScreen(MDScreen):
    def on_enter(self, *args):
        # 通过id获取RecycleView实例并触发加载
        self.ids.snapshots_rv.load_snapshots()

对应的KV文件部分需要给RecycleView设置id:

<DayScreen>:
    SnapshotsRV:
        id: snapshots_rv
        # 其他布局属性(如size_hint、pos_hint等)...

3. 关键逻辑说明

  • 属性绑定:通过self.app.bind(...)监听current_user和current_day_id的变化,只要这两个值更新,就自动调用load_snapshots()刷新数据。
  • 有效性判断:查询前先检查user和day_id是否为有效状态(不是初始的0或None),避免无效的数据库查询。
  • 屏幕进入触发:on_enter方法会在屏幕切换显示时执行,确保每次进入该屏幕都能拿到最新的用户和日期数据。

这样修改后,RecycleView就不会在初始化时用默认值加载数据,而是在用户登录、日期选择完成后,或者屏幕进入时,自动加载对应的数据。

内容的提问来源于stack exchange,提问作者AprilMay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:55:31