Android Question [SOLVED] Help with manipulating (card) views in xCustomListView

rabbitBUSH

Well-Known Member
Licensed User
Good Day/ Evening All

I started a project based on the example provided by @Erel :


The attached zipped project files refer. (NOTE the project will try to write SQL files to SD and I have not worked the permissions bits into this yet - so you may want to tweek that.)

I built the project in the ZIP from a larger project just to attempt to get to grips with the particular thing I have been struggling with : manipulating View elements on each card (label colours, checkbox flips, etc).

The relevant code tab in the IDE is listStuff and the associated script [lines 143 / 144 and 211->214].

In my test project the xCustomListView is loaded with panels, in this case a set of 9, just as expected from the example provided by Erel.

In my test you will see a label in the top right of each panel. This is blue with X as text. What I want is for the user to click the "X" and then it should switch off its Visible property and turn on the Visible property of a label lying underneath which would also be blue but with a TICK as the text. (In the card2 layout I have placed the TICK offset from the X just to make it visible during testing.)

The X label is Enabled on start. The underlying TICK label is never Enabled.

What I can't seem to do, and searches of the fora have not shown any solutions, is to get the X "button" to turn off (invisible) and the TICK button to turn on visible).

My guess is that this is a referencing problem that I can't figure out, OR, its possible to capture the Click action but not to change anything else and what I want to do is not possible.

So, the two labels (add2listlblAction1 [and] add2listlblAction2], to me seem to need something in front of them referring to either and array or a container :

{{ie -> SOMETHING.add2listlblAction1.Visible = True}}​

The reason for this conclusion is that when, for instance the X is clicked on the first card, the X on the LAST card (9 in the test) turned off and the TICK turned on (although it seems without the TICK itself visible for some reason - that could be another question).

I found previously when toying with the example that, while, the colour of the Action labels in the example changed on a click action, and, the click was captured, I could not "pernanently' change the text colour. The same applied to other text or elements on a specific card.

You may note that the action would be CARD specific which means obviously that the change from X to TICK is per card with the response to the click contained in Sub add2listlblAction1_Click {}.
 

Attachments

  • added-by-designer-3.zip
    141.5 KB · Views: 204

Andrew (Digitwell)

Well-Known Member
Licensed User
Longtime User
There are several ways to solve this.

The method I would recommend is using the tag element on the controls themselves.

The key thing to know is that a every call to loadlayout effectively overwrites the variables/controls on the layout with the current ones.

The trick is to saving these within the loop.
so within CreateItem, you could do something like:
B4X:
    add2listlblAction1.tag =     add2listlblAction2
    add2listlblAction2.tag =     add2listlblAction1


now in the click events you can access the other element
B4X:
Sub add2listlblAction1_Click
   dim thislabel as label = sender ' Get the actual clicked label,add2listlblAction1 point to the lastinstance loaded by Load Layout
   dim otherlabel as label = thislabel.tag ' get the other label from the tag

'switch visibility
thislabel.visible =false 
otherlabel.visible = true

The tag accepts objects so it is possible to add multiple items using CreateMap

B4X:
add2listlblAction1.tag = createmap("label2":add2listlblAction2,"title":lblTitle)
so later you can, get at other controls

B4X:
Sub add2listlblAction1_Click
   dim thislabel as label = sender ' Get the actual clicked label, add2listlblAction1 point to the lastinstance loaded by Load Layout

   dim mp as map = thislabel.tag

   dim otherlabel as label = mp.get("label2") ' get the other label from the tag
   dim titlelabel as label = mp.get("title")
'switch visibility
thislabel.visible =false 
otherlabel.visible = true
labeltitle.text = "Clicked action 1"

Hope that helps.

Andrew
 
Upvote 0

rabbitBUSH

Well-Known Member
Licensed User
@Andrew (Digitwell) Thanks; that makes sense. I guess I could see the direction but the technique wasn't within past experience. Haven't learnt the power of TAGs yet.

every call to loadlayout effectively overwrites the variables/controls on the layout with the current ones
Mmmm, must remember that point it didn't occur to me :rolleyes:

Thanks for taking the time to review the code and offer this solution.

I will apply your suggestions which I am sure will be a great help.

Unfortunately, our electricity utility company is probably about to switch us off in their load-shedding campaign against the consumer, so the attempt to apply the fix will most likely be later early in the new day or during daylight tomorrow ... :D

Much appreciated, thanks....
 
Upvote 0

rabbitBUSH

Well-Known Member
Licensed User
@Andrew (Digitwell) Brilliant, Thanks for that; works perfectly. Much appreciated help and the elegant solution. More perfect than that only comes with being outside tonight's load shedding regions - - - - well, 'til tomorrow 5am......

cheers
 
Upvote 0
Top