如何基于其他类的变量更新加载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
相关产品推荐
相关产品推荐

