1、数据项点击事件,针对的是ListView每个数据项的点击事件

listView.setOnItemClickListener { _, _, position, _ -> Toast.makeText(this, "position: $position", Toast.LENGTH_LONG).show()}

2、ListView组件焦点事件(不是指单个item,是整个ListView)

listView.setOnFocusChangeListener { _, hasFocus -> if (hasFocus) { Log.d("MainActivity", "has focus ... ") } else { Log.d("MainActivity", "lose focus ...") }}

3、ListView中数据项被选中事件监听

bind.listView.onItemSelectedListener = object: AdapterView.OnItemSelectedListener{ override fun onItemSelected(parent: AdapterView<*>?,view: View?,position: Int,id: Long) { Log.d("MainActivity", "position: $position") } override fun onNothingSelected(parent: AdapterView<*>?) { Log.d("MainActivity", "onNothingSelected ...") }}

AdapterView.OnItemSelectedListener中有两个方法,onItemSelected在数据项被选中时触发,onNothingSelected在LiveView没有任何数据项被选中时触发。

4、监听ListView中item焦点的变化

假设有一个需求,item获取焦点背景颜色为blue,没有焦点的背景颜色为white,则伪代码如下:

Adapter中代码

class FruitAdapter(activity: Activity, private val resourceId: Int, data: List):

ArrayAdapter(activity, resourceId, data) {

var position: Int = 0

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

Log.d("FruitAdapter", "position: $position convertView: $convertView")

val view = ... //加载布局伪代码

if (this.position == position) {

view.setBackgroundColor(Color.BLUE)

} else {

view.setBackgroundColor(Color.WHITE)

}

return view

}

}

Adapter中定义了一个position,用来记录当前哪个item被选中,数值由Activity那边监听更新

MainActivity中代码

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

val bind = ActivityMainBinding.inflate(layoutInflater)

setContentView(bind.root)

val fruitAdapter = FruitAdapter(this, R.layout.fruit_item, fruitList)

bind.listView.adapter = fruitAdapter

bind.listView.onItemSelectedListener = object: AdapterView.OnItemSelectedListener{

override fun onItemSelected(parent: AdapterView<*>?,view: View?,position: Int,id: Long) {

Log.d("MainActivity", "position: $position")

fruitAdapter.position = position

fruitAdapter.notifyDataSetChanged()

}

override fun onNothingSelected(parent: AdapterView<*>?) {

Log.d("MainActivity", "onNothingSelected ...")

}

}

}

看红色代码即可,获取ListView对象后,添加onItemSelectedListener 监听,然后把选中的item下标传递给Adapter。这时调用Adapter的方法notifyDataSetChanged()来通知Adapter刷新数据,再次执行Adapter中getView()方法,在getView方法中对下标进行了比较,相等下标的view背景色变为blue,否则变为while,这样就实现了ListView中item焦点变化事件的监听。