向KivyMD的MDList添加ListItem后首项外其余成员均为空白问题求解
问题产生原因
BaseListItem继承自基础Widget类,本身不具备自动排列子控件的能力,你直接通过add_widget()添加的三个子OneLineListItem默认会堆叠在父控件的(0,0)坐标,尺寸默认填充父控件,导致同一条目内的三个文本控件重叠,多条目添加后不同条目的控件视觉错位堆叠,就会出现所有文本都集中到第一个条目的现象。- 设计逻辑错误:
OneLineListItem本身是完整的列表项组件,设计用途是直接作为MDList的子条目,不应该嵌套在另一个列表项内部,嵌套后布局规则冲突,会导致高度、位置计算全部异常。 - 自定义列表项内没有配置对应布局容器,子控件没有水平排列规则,自然无法实现左中右分布的三文本布局。
实现方案
无需嵌套多个OneLineListItem,直接在自定义列表项内部使用水平BoxLayout承载三个不同对齐方式的文本即可,代码如下:
自定义列表项代码
from kivymd.uix.list import BaseListItem from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.label import MDLabel class LynisResultListItem(BaseListItem): def __init__(self, lynis_result=None, **kwargs): super().__init__(**kwargs) # 固定条目高度 self.height = 60 # 关闭条目默认底部分隔线,解决黑线问题 self.divider = None # 添加水平布局作为子控件容器 container = MDBoxLayout( orientation='horizontal', padding=[16, 0, 16, 0], spacing=8 ) self.add_widget(container) # 左侧左对齐类型文本 type_label = MDLabel( text=lynis_result.type if lynis_result else "Suggestion", halign='left', size_hint_x=0.2 ) # 中间居中对齐编码文本 code_label = MDLabel( text=lynis_result.code if lynis_result else "AUTH-9328", halign='center', size_hint_x=0.3 ) # 右侧右对齐消息文本 msg_label = MDLabel( text=lynis_result.message if lynis_result else "", halign='right', size_hint_x=0.5 ) container.add_widget(type_label) container.add_widget(code_label) container.add_widget(msg_label)
列表添加条目代码
# 传入你自己的LynisResult对象生成条目 result_item = LynisResultListItem(lynis_result=你的结果实例) self.ids.list_LynisResults.add_widget(result_item)
如果需要全局关闭MDList的所有分隔线,直接修改kv配置即可:
MDList: id: list_LynisResults divider: None
内容的提问来源于stack exchange,提问作者jq09
相关产品推荐
相关产品推荐

