我在使用Sqlite游标的Android中遇到了一个非常奇怪的问题。游标在Activity.onResume中创建,并在内部RecyclerView.Adapter中使用。在适配器的getItemViewType(position)调用中,我调用cursor.moveToPosition(position),然后获取内容以确定哪个视图:
override fun onResume() {
_cursor = DB.sql().query(....)
rv.adapter = MyAdapter()
}
inner class MyVH(view:View) : RecyclerView.ViewHolder(view) {
...
}
inner class MyAdapter : RecyclerView.Adapter<MyVH>() {
private val _index_contentType = _cursor!!.getColumnIndex("ContentType")
override fun getItemCount() = _cursor!!.count
override fun getItemViewType(position:Int) {
Log.i(TAG, "getItemViewType with $position and count=${_cursor!!.count}")
_cursor!!.moveToPosition(position)
Log.i(TAG, "getItemViewType with $position and count=${_cursor!!.count}")
val contentType = _cursor.getInt(_index_contentType)
}
}
我在这一行得到了IndexOutOfBoundaryException:
val contentType = _cursor.getInt(_index_contentType)
因此,我添加了2条日志以验证原因。和日志打印
getItemViewType with 10 and count=11
getItemViewType with 10 and count=10
如果再次重新查询_cursor更改,我也会打印日志,但是在这种情况下_cursor不会更改。我不为什么_cursor.count可以在moveToPosition中更改,有人可以对此有所了解吗?