【问题标题】:kivy recycleview gridlayout how to display a single rowkivy recycleview gridlayout如何显示单行
【发布时间】:2021-10-26 08:07:58
【问题描述】:

抱歉这个问题,但我的名声不允许评论 ikolim 对这个问题的出色回答:Python : How to add vertical scroll in RecycleView

在此代码中,仅显示一行存在问题。我试过了,但无法解决。

表达我的意思:

更改 RV(RecycleView) 类中的代码

    def get_states(self):
        # self.db_cursor.execute("SELECT * FROM customers ORDER BY CustomerId ASC")
        self.db_cursor.execute("SELECT * FROM Customers WHERE Customers.CustomerId = 1")
        rows = self.db_cursor.fetchall()

        data = []
        low = 0
        high = self.total_col_headings - 1
        for row in rows:
            for i in range(len(row)):
                data.append([row[i], row[0], [low, high]])
            low += self.total_col_headings
            high += self.total_col_headings

        self.rv_data = [{'text': str(x[0]), 'Index': str(x[1]), 'range': x[2], 'selectable': True} for x in data]
        print('rv_data', self.rv_data)

RecycleView 按预期显示标题节点,但仅显示一个数据节点。鼠标点击数据节点显示所需的行数据。

正如我之前提到的,我试图找出必须更改代码以获得预期结果的位置。

我希望我的描述现在更清楚一点。

感谢询问!

【问题讨论】:

  • 请详细说明您的问题
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: kivy


【解决方案1】:

唉,简单的答案是:这是一个古怪的 RecycleGridLayout 问题! https://github.com/kivy/kivy/issues/7255

显示单行数据的一个糟糕的解决方法是为另一行添加虚拟数据。

main.py 中的代码基础是 PalimPalim 对这个问题的回答稍作修改的版本:Kivy - python - multiple widgets in recycleview row

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.properties import NumericProperty, ListProperty
    from kivy.uix.recycleview import RecycleView
    from kivy.uix.recycleview.views import RecycleDataViewBehavior
    from kivy.uix.label import Label
    from kivy.properties import BooleanProperty
    from kivy.uix.behaviors import FocusBehavior
    
    from customRecyclegridlayout import CustomRecycleGridLayout
    from Examples.RecycleGridLayout_Palim.customlayout import CustomLayoutSelectionBehavior
    
    Builder.load_string('''
    <SelectableLabel>:
        # Draw a background to indicate selection
        canvas.before:
            Color:
                rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)
            Rectangle:
                pos: self.pos
                size: self.size
    <RV>:
        viewclass: 'SelectableLabel'
        data: root.data
        SelectableRecycleGridLayout:
            id: recycle_grid
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'lr-tb'
            multiselect: True
            touch_multiselect: True
            cols: root.rv_columns
    ''')
    
    
    class SelectableRecycleGridLayout(FocusBehavior, CustomLayoutSelectionBehavior, CustomRecycleGridLayout):
        ''' Adds selection and focus behaviour to the view. '''
    
    
    class SelectableLabel(RecycleDataViewBehavior, Label):
    
        ''' Add selection support to the Label '''
        index = None
        selected = BooleanProperty(False)
        selectable = BooleanProperty(True)
    
        def refresh_view_attrs(self, rv, index, data):
            ''' Catch and handle the view changes '''
            self.index = index
            return super(SelectableLabel, self).refresh_view_attrs(
                rv, index, data)
    
        def on_touch_down(self, touch):
            ''' Add selection on touch down '''
            if super(SelectableLabel, self).on_touch_down(touch):
                return True
            if self.collide_point(*touch.pos) and self.selectable:
                return self.parent.select_with_touch(self.index, touch)
    
        def apply_selection(self, rv, index, is_selected):
            ''' Respond to the selection of items in the view. '''
            self.selected = is_selected
            if is_selected:
                print("selection changed to {0}".format(rv.data[index]))
            else:
                print("selection removed for {0}".format(rv.data[index]))
    
    
    class RV(RecycleView):
        rv_columns = NumericProperty(3)  # set number of columns in RecycleView
        items = ListProperty()
        data = ListProperty([])
    
        def __init__(self, **kwargs):
            super(RV, self).__init__(**kwargs)
            items_entity_0 = []
            items_entity_1 = [0, "apple", "fox"]
            items_entity_2 = [0, "apple", "fox", 1, "bone", "dog"]
            items_entity_3 = [0, "apple", "fox", 1, "bone", "dog", 2, 'milk', "cat"]
    
            self.data = self._get_formatted_data(self._check_itemsList(items_entity_1))
            self.app_info = App.get_running_app()
    
        def _check_itemsList(self, item_list):
            i_list = item_list
            if self.rv_columns == len(i_list):
                print('single row detected!')
                for element in range(self.rv_columns):
                    i_list.append('dummy')
    
            return i_list
    
        @staticmethod
        def _get_formatted_data(item_list):
            data = [{'text': str(x)} for x in item_list]
            return data
    
    
    class TestApp(App):
        def build(self):
            return RV()
    
    
    if __name__ == '__main__':
        TestApp().run()

【讨论】:

  • 你能总结一下你的结局吗?这只是一个已知的错误吗?或者有解决方法吗?如果是后者,您能否在此处提供解决方法的说明,以便您的答案主要不依赖于链接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多