Default ListView
ListView
mặc định sẽ trông thế này, mỗi dòng 1 TextView
.
Code ra nó chỉ cần dùng default Adapter
như này:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setUI()
}
fun setUI(){
val listView = ListView(this)
rl_main_activiy.addView(listView) /* rl_main_activiy: root view id */
val data = arrayListOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m")
listView.adapter = ArrayAdapter( this, android.R.layout.simple_list_item_1, data)
}
}
Nếu vẫn chưa biết Adapter
để làm gì, thì nó đóng vai trò như lớp trung gian để đổ dữ liệu vào ListView
(nói riêng).
Mà còn thắc mắc findViewById()
ở đâu thì xin nhắc đây là Kotlin
nhé, không phải Java
.
Giờ muốn hiện thị nhiều hơn thì sao? Như là hiện thị 3 TextView
trên 1 dòng. Câu trả lời là hãy đi custom ListView
.
Custom Listview
Custom Layout
Tạo 1 custom Layout
như thế này:
1 | <?xml version="1.0" encoding="utf-8"?> |
Trông sẽ như thế này:
Custom Adapter
Data
là class chứa 3 giá trị của 3 TextView
:
1 | class Data(val p1: String, val p2: String, val p3: String) |
Tạo 1 class ListviewAdapter
, class này extend lại BaseAdapter
Hoặc ArrayAdapter
, ở đây sẽ extend BaseAdapter
.
Sau đó ta cần override nhưng phương thức của lớp Cha:*
getView()
: Trả về view cho mỗi item trong ListView
*
getItem()
: Trả về vị trí của item trong ListView
*
getItemId()
: Trả về id của item trong ListView
*
getCount()
: Trả về kích cỡ của ListView
1 | class ListviewAdapter(val activity: MainActivity, val data: ArrayList<Data>): BaseAdapter(){ |
Chắc là ai cũng thắc mắc là getItem()
với getItemId()
để làm gì.
Trong getView()
, ngoài cách lấy vị trí item trực tiếp từ biến postion
, ta có còn có 1 cách nữa, đó là lấy thông qua getItem()
hoặc getItemId()
.
Khác nhau là khi lấy vị trí trực tiếp từ biến postion
, thì chỉ có thể lấy thôi. Nhưng lấy qua getItem()
hoặc getItemId()
, ta còn có thể làm nhiều thứ nữa, như đoạn code bên trên sẽ show Log()
ra chẳng hạn.
getItem()
và getItemId()
cũng không khác nhau ngoài trả về khác kiểu dữ liệu, nếu item có id riêng thì sẽ thực hiện lấy id đó trong getItemId()
.
Set Adapter
Có custom Layout
và custom Adapter
rồi, việc cuối cùng là đổ dữ liệu vào ListView
thông qua custom Adapter
1 | class MainActivity : AppCompatActivity() { |
Kết quả:
Events
Sau khi đã custom ListView
, chúng ta cần bắt sự kiện cho nó:
*
parent: view cha.*
view: view đã chạm.*
position: vị trí trong ListView
.*
id: id của view.
OnItem
Sự kiện khi chạm
1 | listView.setOnItemClickListener { parent, view, position, id -> |
OnItemLong
Sự kiện khi chạm và giữ1
2
3
4listView.setOnItemLongClickListener { parent, view, position, id ->
Toast.makeText(this, "Long ${view.textView.text} ${view.textView2.text} ${view.textView3.text}", Toast.LENGTH_SHORT).show()
true
}
Add, Remove Items
Add Items
Thêm một phần tử vào ListView
:
1 | data.add(Data("new item","new item","new item")) |
Remove Items
Xóa phẩn tử khỏi ListView
:
1 | data.removeAt(position) |
Phải chắc chắn gọi notifyDataSetChanged()
để thay đổi.
URL QR