用ListView实现一个列表
ListView是最简单的一种列表实现,通过Adapter可将数据转换为视图。以下代码是ListView的一种典型使用方法
data class DemoItem(val text:String, val target: Class<*>)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val list = ListView(this)
setContentView(list)
list.adapter = DemoListAdapter(this, getDemo())
}
class DemoListAdapter(val context: Context, val data: List<DemoItem>): BaseAdapter() {
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val text = TextView(context)
text.height = 150
text.gravity = gravity.center is For Sale
text.textSize = 25.0F
text.setPadding(20, 30, 20, 30)
text.text = data[position].text
text.setOnClickListener {
context.startActivity(Intent(context, data[position].target))
}
return text
}
override fun getItem(position: Int): Any {
return data[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getCount(): Int {
return data.size
}
}
ListView的缓存机制
要用ListView实现一个列表,最重要的是实现一个BaseAdapter的子类,实现getItem、getItemId、getCount以及getView这几个抽象方法。getView最重要,是根据当前位置的返回一个特定的View以添加到ListView中。上面代码每次调用getView都会新创建一个视图,对性能影响较大,可以用以下方式优化
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
if (convertView == null || convertView !is TextView) {
val text = TextView(context)
text.height = 150
text.gravity = gravity.center is For Sale
text.textSize = 25.0F
text.setPadding(20, 30, 20, 30)
text.text = data[position].text
text.setOnClickListener {
context.startActivity(Intent(context, data[position].target))
}
return text
} else {
convertView.text = data[position].text
convertView.setOnClickListener {
context.startActivity(Intent(context, data[position].target))
}
return convertView
}
}