Как реализовать RecycleView как частичное представление, которое может быть обновлено нажатием кнопки? - PullRequest
0 голосов
/ 02 апреля 2019

В настоящее время я работаю над проектом, который извлекает данные из API и экспортирует полностью отформатированный документ Excel с использованием Python.У меня теперь работает весь внутренний код (получение данных, создание списков и экспорт документа Excel). Сейчас я просто работаю над пользовательским интерфейсом Kivy, чтобы конечный пользователь мог его использовать.(Я очень новичок в Kivy и изучаю его по ходу дела)

Моя проблема в настоящее время находится на моей второй странице.На этой странице у них есть возможность выбрать тип события, а затем выполнить поиск по диапазону дат, чтобы увидеть все возможные события, из которых они могут выбрать.У меня есть настройки списков, но теперь я хочу, чтобы эти данные отображались в правой части экрана.С левой стороны у них есть все кнопки и выпадающие списки для сужения поиска, а с правой стороны просто должен быть какой-то список по выбору.

Я бы хотел, чтобы пользователь мог выбрать свои критерии поиска, а затем нажать кнопку, которая гаснет, извлекает все события и отображает их в списке.Они должны иметь возможность обновить свои критерии, а затем снова нажать кнопку поиска, чтобы обновить результаты.

Я хотел использовать RecycleView, но все примеры, которые я продолжаю находить, - это когда RecycleView - это виджет, возвращаемый в сборке, поэтому он занимает весь экран.В настоящее время я использую диспетчера экранов с отдельными экранами и настраиваю экран на две разные BoxLayouts.Я хочу, чтобы правильный BoxLayout содержал RecycleView.

Что я собираюсь сделать после RecycleView?Нужно ли иметь собственный экран и свой собственный класс?

Вот пример, который я испортил для тестирования, но я не уверен, как внедрить нечто подобное в мое собственное приложение.

  1. Как self.data связана с root.text?Является ли self.data полным списком?
  2. Как мне иметь несколько столбцов?
  3. Если я хочу обновить данные одним нажатием кнопки, нужно ли использовать «refresh_from_data (* largs, ** kwargs) "?Как это работает?

Если кто-то может помочь направить меня в правильном направлении, я могу это понять.Я думаю, что этот пример может дать достаточно, чтобы отработать.

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.popup import Popup

Builder.load_string('''
#:kivy 1.10.0
#: import Popup kivy.uix.popup

<MessageBox>:
    title: 'Popup Message Box'
    size_hint: None, None
    size: 400, 400

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: root.message
        Button:
            size_hint: 1, 0.2
            text: 'OK'
            on_press: root.dismiss()

<RecycleViewRow>:
    orientation: 'horizontal'
    Label:
        text: root.text
    Button:
        text: 'Show'
        on_press: app.root.message_box(root.text)

<MainScreen>:
    viewclass: 'RecycleViewRow'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'                    
                    ''')

class MessageBox(Popup):
    message = StringProperty()

class RecycleViewRow(BoxLayout):
    text = StringProperty()

class MainScreen(RecycleView):
    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)
        self.data = [{'text': "Button " + str(x), 'id': str(x)} for x in range(3)]

    def message_box(self, message):
        p = MessageBox()
        p.message = message
        p.open()
        print('test press: ', message)

class TestApp(App):
    title = "RecycleView Direct Test"

    def build(self):
        return MainScreen()

if __name__ == "__main__":
    TestApp().run()

1 Ответ

0 голосов
/ 02 апреля 2019
  1. Как self.data связана с root.text?Является ли self.data полным списком?

root.text каждого RecycleViewRow заполняется клавишей "text" каждого элемента в self.data.self.data - это данные всего списка.

Как у меня несколько столбцов?

Если виджет RecycleViewRow создается с несколькими столбцами (например, горизонтальный BoxLayout с множеством меток), то в списке многостолбцы.
Не забывайте, что список - это просто множество виджетов его viewclass.

Если я хочу обновить данные одним нажатием кнопки, нужно ли мне использовать «refresh_from_data (* largs, ** kwargs)»?Как это работает?

Да.Это просто говорит RecycleView перечитать свои данные (self.data в этом примере) и заново заполнить список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...