Проблема в том, что вы добавляете 2.jpg
Image
к viewclass
из RecycleView
. Функция RecycleView
заключается в переработке экземпляров viewclass
. Поэтому, если вы измените один из этих экземпляров, он может появиться в любом месте RecycleGridLayout
и, вероятно, будет перемещаться без учета RVItem
, к которому вы хотели применить эту модификацию.
Ответ следующий: что всякий раз, когда вы хотите изменить RVItem
, вы должны сделать это, используя data
из RecycleView
. Вот модифицированная версия вашего кода, которая добавляет изображение к canvas
из RVItem
путем добавления ключа added
к данным:
from kivy.properties import BooleanProperty
from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.imagelist import SmartTileWithLabel
KV_CODE = '''
<RVItem>:
canvas:
# uncomment these lines to get a black background behind the checkbox
# Color:
# rgba: 0,0,0,1
# Rectangle:
# size: 32, 32
# pos: self.x, self.y + self.height - 32
Color:
rgba: 1,1,1,1
Rectangle:
size: 32, 32
pos: self.x, self.y + self.height - 32
source: 'atlas://data/images/defaulttheme/checkbox_on' if self.added else 'atlas://data/images/defaulttheme/checkbox_off'
RecycleView:
viewclass: 'RVItem'
RecycleGridLayout:
#orientation: 'vertical'
cols:2
size_hint_y: None
height: self.minimum_height
default_size_hint: 1, None
default_size: 100,300
spacing: 20
padding: 10
'''
class RVItem(SmartTileWithLabel):
added = BooleanProperty(False)
def on_release(self):
# find this item in the data
root = MDApp.get_running_app().root
data = root.data
for d in data:
if d['text'] == self.text:
# found this item, change `added` to opposite
d['added'] = not d['added']
root.refresh_from_data()
break
class SampleApp(MDApp):
def build(self):
return Builder.load_string(KV_CODE)
def on_start(self):
rv = self.root
rv.data = ({'text': str(i), 'source':'1.jpg', 'added':False } for i in range(5))
SampleApp().run()