Skip to content

Instantly share code, notes, and snippets.

@CoutinhoElias
Last active September 8, 2021 21:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CoutinhoElias/08509bf6d3872fc185727ef23dbf31f9 to your computer and use it in GitHub Desktop.
Save CoutinhoElias/08509bf6d3872fc185727ef23dbf31f9 to your computer and use it in GitHub Desktop.
Criando seu primeiro RecycleView com Kivy
# Precisei criar um widget semelhante aos do KivyMD
# a forma mais simples é copiando do próprio kivyMD
# E como farei isso?
# fui em https://kivymd.readthedocs.io/en/latest/components/list/#twolineavatarlistitem
# e copiei o conteúdo abaixo:
'''
TwoLineAvatarListItem:
text: "Two-line item with avatar"
secondary_text: "Secondary text here"
ImageLeftWidget:
source: "data/logo/kivy-icon-256.png"
'''
# No arquivo main.py fiz o import da classe TwoLineAvatarListItem
from kivymd.uix.list import TwoLineAvatarListItem
# E da proriedade StringProperty
from kivy.properties import StringProperty
#Criei uma classe própria que herda de TwoLineAvatarListItem:
class ImagemComDuasLinhas(TwoLineAvatarListItem):
source = StringProperty()
# Na classe da Screen modifiquei somente o conteúdo dentro fo 'for'
class ScreenListItens(Screen):
def on_kv_post(self, base_widget):
p = Detalhe.select(Detalhe.dsdetalhe, Detalhe.cdprincipal) \
.order_by(Detalhe.cdprincipal)
sample_images = [
'coragem_de_saco_cheio.png',
'coragem_feliz.png',
'coragem_teu.png',
'menu.png',
'python.png'
]
for row in p.dicts():
# Para funcionar você deve ter imagens com esses mesmos nomes ou edite essa lista.
self.ids.rv.data.append(
{
#"viewclass": "ItemImage",
"source": './images/{}'.format(choice(sample_images)), #"ImageLeftWidget": choice(sample_images),
"text": row['cdprincipal'],
"secondary_text":row['dsdetalhe'],
"callback": lambda x: x,
}
)
# Na linha 32 acima criei uma lista de nomes de imagens, fiz apenas para
# simular imagens diferentes e tornar a aplicação mais atraente.
# Claro que essas imagens devem vir do banco de dados ou da núvem mas como
# não temos em nenhum deles eu simulei.
# Na linha 42 acima começo a adicionar Widgets à lista exatamente no id rv.
# Da linha 45-47 acima começo a enviar as informações que desejo mostrar
# na minha lista.
''' D E T A L H A N D O'''
# Linha 45: passo o caminha e concateno com uma imagem aleatória
# em sample_images.
# Linha 46: Informo qualquer texto, escolhi código principal do produto.
# Linha 47: Informo qualquer texto, escolhi a descrição do produto.
# Na linha 48 chamo uma função qualquer para quando o usuário clique no
# objeto.
'''A R Q U I V O .KV'''
# Abaixo criei o modelo da classe ImagemComDuasLinhas que definimos acima
# na linha 21:
'''
<ImagemComDuasLinhas>:
text: "DUAS LINHAS COM AVATAR"
secondary_text: "SEGUNDA LINHA AQUI"
ImageLeftWidget:
source: root.source
'''
# Abaixo temos a nossa Screen
'''
<ScreenListItens>:
name: "list_itens"
FloatLayout:
orientation: 'vertical'
RecycleView:
id: rv
viewclass: 'ImagemComDuasLinhas'
key_size: 'height'
pos_hint: {'center_x': 0.5, 'center_y': 0.39}
RecycleBoxLayout:
padding: dp(10)
# Tamanho do retangulo com a imagem e os textos
default_size: None, dp(70)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
'''
# Na linha 86 defini o bloco como FloatLayout para que eu tenha
# mais liberdade na posição do widget.
# Na linha 89 temos o nosso RecycleView que será usado com
# as informações que enviamos a partir da linha 42.
# Na linha 90 definimos o ID do RecycleView usado na linha 42.
# Na linha 91 instanciamos a classe ImagemComDuasLinhas que criamos
# na linha 21.
# Nas linhas 92-93 me refiro a posicionamento e tamanho do RecycleView.
# Na linha 94 criamos um RecycleBoxLayout que faz parte do RecycleView.
# Nas linhas 95-101 são apenas mais formatações do widget.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment