Android Tutorial ListView tutorial

eps

Expert
Licensed User
Longtime User
I wonder how I'll be able to allow a user to delete an item from a listview upon long clicking and displaying a menu to them... any help?

You can't really, but.... you _could_ have two ListViews and flip between them as you remove items.
 

Kwame Twum

Active Member
Licensed User
Longtime User
thanks eps, but actually my listview populates from a file created on the SDcard through a list.

B4X:
Dim list1 = File.ReadList(File.DirRootExternal, "folder1/listfile.txt")
For  i = 0 To list1.Size
i=i+1  'ignoring first item in text file
lview.AddSingleLine(translist.Get(i))  'lview is the listview added to Globals from the designer
Next

Is there anyway I could delete just a line from the text file on the SDcard?

The plan is to display a menu upon long clicking an item in the listview, then deleting the line from the text file when the user clicks "delete" from the menu. ;) Help.
 

Kwame Twum

Active Member
Licensed User
Longtime User
I thought of that... but how do you determine the index if the item that was long clicked?
Searched, but there was nothing like "SelectedItem" or any of its kind..:(
 

NJDude

Expert
Licensed User
Longtime User
I would suggest you read the docs or read the beginner's guides (click on the DOCUMENTATION link on my signature) all that is explained there and there are also samples, it will make your life easier.
 

Kwame Twum

Active Member
Licensed User
Longtime User
Solved. created a type with two parameters
B4X:
'My Class - class module
Sub Class_Globals
    Type MyListViewData (FirstRow As String, SecondRow As String)
End Sub

Activity Module

B4X:
Sub Globals
Dim mylistz as listview
End Sub

Dim newlist As List:newlist.Initialize
'Get first and second items in each listview item and save it as a list

For i=0 To mylistz.Size-1   'mylistz wasn't initialised cuz it's generated by designer
      Dim mydata As MyListViewData
      mydata=mylistz.GetItem(i)
      newlist .Add(mydata.FirstRow)  'add first row of current item in listview
      newlist .Add(mydata.SecondRow) 'add second row of current item listview
Next

Newlist is populated with all lines ;)
 

StarinschiAndrei

Active Member
Licensed User
Longtime User
Hello,
How can i read the tag value in listview ?

Sub LoadList(itemName As String )
lv1.Clear
lv1.Initialize("ListView1")
lblarticle=lv1.SingleLineLayout.Label
lv1.SingleLineLayout.ItemHeight = 40dip
lv1.SingleLineLayout.Label.TextSize = 14
lv1.SingleLineLayout.Label.TextColor = Colors.Black
lv1.SingleLineLayout.Label.Gravity = Gravity.LEFT
lv1.ScrollingBackgroundColor=Colors.Transparent
lv1.Color=Colors.White
For i = 1 To 300
lv1.AddSingleLine(itemName & i)
lv1.SingleLineLayout.Label.Tag = i
Next
Activity.AddView(lv1,0 ,35%x, 100%x,40%y)
End Sub
 

StarinschiAndrei

Active Member
Licensed User
Longtime User
You cannot set nor get the Tag property of a given Label in a ListView.
All properties for lv1.SingleLineLayout.Label are valid for all Labels.
What do want to do with the Tag ?

Best regards.
Hi Klaus ,
i want to store a value in tag for each items in the listview. Than i click on one item and read tag value.
Thank you
 

klaus

Expert
Licensed User
Longtime User
i want to store a value in tag for each items in the listview. Than i click on one item and read tag value.
When you click on an item in a ListView the ItemClick (Position As Int, Value As Object) event will be raised.
And Position is the index of the selected item, so no need for the Tag property.

Best regards.
 

StarinschiAndrei

Active Member
Licensed User
Longtime User
When you click on an item in a ListView the ItemClick (Position As Int, Value As Object) event will be raised.
And Position is the index of the selected item, so no need for the Tag property.

Best regards.
Hi Klaus ,

I know , but i wanted to assign a diffrent value than position or value. this is the reason that i thought that i can use the tag.
 

GMan

Well-Known Member
Licensed User
Longtime User
Hoi,
i try th get the Text of the Labels of the TwoLineAndBitmap items.

This
B4X:
Dim MyItemText as String
Sub ListView1_ItemClick (Position As Int, Value As Object)
    MyItemText = Listview1.TwoLinesAndBitmap.Label.Text
End Sub
returns nothing - but why ?
 

Mahares

Expert
Licensed User
Longtime User
I think you want to do this:
B4X:
For i= 0 To 4
          ListView1.AddTwoLinesAndBitmap2("first" & i,i*i,LoadBitmap(File.DirAssets,"warning-icon.png"),"first" & i)
Next

Sub ListView1_ItemClick (Position As Int, Value As Object)
    Dim MyItemText As String =Value
    Msgbox("I chose: " & MyItemText,"Selected Item")
End Sub
 

GMan

Well-Known Member
Licensed User
Longtime User
Thx so far - i had to decribed it better:
i want to transfer the seletced label text into another activity.
When DIMming it as a global variable it wont work, other the result is not the text of the label but the value ot the selected index

And when trying
B4X:
Dim MyItemText As String = Listview1.TwoLinesAndBitmap.Label.Text
the ersult is again NOTHING or the the selected INDEX (as Integer)
 

GMan

Well-Known Member
Licensed User
Longtime User
I fill it manually like
B4X:
Listview1.AddTwoLinesAndBitmap2("Label1text","Label2text",LoadBitmap(File.DirAssets ,"someimage.gif"),1)
etc.

In my "results" so far only the return is displayed (1 in this case), but not" Label1text"

Problem is (as written) that after the click a new activity with panel was loaded and the label on the panel should contain "Label1text"
 

GMan

Well-Known Member
Licensed User
Longtime User
SOLVED - i named the return value as the same as the label1.text - so it works

Thx to all 4 helping me :D
 

luke2012

Well-Known Member
Licensed User
Longtime User
The ListView control is a very powerful control. It allows you to show short or long lists in a very "sleek" way.

Creating a simple list is easy:
B4X:
Sub Globals
    Dim ListView1 As ListView
End Sub

Sub Activity_Create(FirstTime As Boolean)
    ListView1.Initialize("ListView1")
    For i = 1 To 300
        ListView1.AddSingleLine("Item #" & i)
    Next
    Activity.AddView(ListView1, 0, 0, 100%x, 100%y)
End Sub
Sub ListView1_ItemClick (Position As Int, Value As Object)
    Activity.Title = Value
End Sub
lv_single.png


The ListView can be added programmatically or with the designer. For now the items must be added with code.
About the code:
- ListView1.Initialize("ListView1") - Here we initialize the list and set the event name property to ListView1. Which means that in order to catch related events we should have subs like: ListView1_ItemClick.
- ListView1.AddSingleLine - adds a single line item.
- Activity.AddView(ListView1, 0, 0, 100%x, 100%y) - Note the use of the percentage units. We are setting the width and height to the values of the containing activity.

There are currently three types of items: single line, two lines and two lines and bitmap.
Each type can be customized. The default look is:

lv_1.png


This is the relevant code:
B4X:
    Dim Bitmap1 As Bitmap
    Bitmap1.Initialize(File.DirAssets, "button.gif")
    For i = 1 To 300
        ListView1.AddSingleLine("Item #" & i)
        ListView1.AddTwoLines("Item #" & i, "This is the second line.")
        ListView1.AddTwoLinesAndBitmap("Item #" & i, "This is the second line.", Bitmap1)   
    Next
We can set different bitmaps to different items. Note that this code loads an image file named button.gif. This file should be added to the Files tab (in the right pane). You can download the project which is attached to this post.

Customizing each type
Each of the three types can be customized. The change will affect all items of that type.
The ListView has three "models" which are stored under:
- SingleLineLayout
- TwoLinesLayout
- TwoLinesAndBitmap

Each of this model has an ItemHeight property, a Background property and one or more views properties. Again, if you change any of these properties it will affect all the items of this type.
Example of customizing the single line items:
B4X:
ListView1.SingleLineLayout.ItemHeight = 100dip
    ListView1.SingleLineLayout.Label.TextSize = 20
    ListView1.SingleLineLayout.Label.TextColor = Colors.Blue
    ListView1.SingleLineLayout.Label.Gravity = Gravity.CENTER
    For i = 1 To 300
        ListView1.AddSingleLine("Item #" & i)
        ListView1.AddTwoLines("Item #" & i, "This is the second line.")
        ListView1.AddTwoLinesAndBitmap("Item #" & i, "This is the second line.", Bitmap1)   
    Next
Result:
lv_3.png


Note that the ItemHeight is set to 100dip. The 'dip' unit causes it to automatically scale the height based on the current device scale. For the TextSize it is a mistake to use dip units as the text size is already measured in scaled units.

The above code is equivalent to this code (which is a bit more clear):
B4X:
    ListView1.SingleLineLayout.ItemHeight = 100dip
    Dim label1 As Label
    label1 = ListView1.SingleLineLayout.Label 'set the label to the model label.
    label1.TextSize = 20
    label1.TextColor = Colors.Blue
    label1.Gravity = Gravity.CENTER
In a similar way you can change the way the other types look.
The other types have additional views: SecondLabel and ImageView.

Return value
First notice that there is no selected item. The reason is that the combination of scrolling the list with finger and scrolling with the wheel or keyboard makes it non relevant.
You should catch the ItemClick event and then handle the clicked item.
The value of the clicked item is passed as a parameter.
Now, what is a value of an item???
By default this is the text stored in the first line.
However you can change it to any object you like by using:
AddSingleLine2, AddTwoLines2 and AddTwoLinesAndBitmap2 methods. These methods receive an additional parameter which is the return value. This allows you to pass more information as required by your application.

Background optimization
There is a hidden assumption that the background behind the ListView is solid black. If you set the background to something else like a gradient background or image you will see that during scrolling the background disappears.
You can change the background scrolling color with the ScrollingBackgroundColor property. If the background is not solid color set it to Colors.Transparent.

Example (the activity background is a gradient):
B4X:
    Dim GD As GradientDrawable
    GD.Initialize("TR_BL", Array As Int(Colors.Gray, Colors.LightGray))
    Activity.Background = GD
    ListView1.ScrollingBackgroundColor = Colors.Transparent
Tips
If you want a single line item with a bitmap (and do not need two lines and a bitmap), you can set the visible property of the second label to false.

If you have many items then you should enable the fast scroller:
B4X:
ListView1.FastScrollEnabled = true
lv_2.png


A small example is available here: http://www.b4x.com/android/files/tutorials/ListView.zip

Hi @Erel.
I'm using the "AddTwoLinesAndBitmap" method and I put a test in the first line and also in second line.
To access the text in first line i use : dim item as string=myListView.GetItem(position)
How to access the second line of the item ?
 
Last edited:
Top