首页 > 解决方案 > 如何在Android中执行单击ListView元素的按钮

问题描述

我有 listView,每个元素都包含 1 个按钮 在此处输入图像描述

当用户按下 ListView 的某些元素(但不是按钮)时,它可以正常工作并且 android 显示 toast:“未单击按钮,$position 正常工作”

但是当在特定的 listView 元素中单击按钮时,我还需要烤面包(并获取按钮的位置)。我尝试使用view.imageViewButton.setOnClickListenerinside,listV.setOnItemClickListener但在这种情况下,按钮只有在单击按钮左侧的空白区域后才起作用。

listV.setOnItemClickListener { parent, view, position, id ->
  //I tried you use comented line to solwe my problem
  //view.imageViewButton.setOnClickListener { Toast.makeText(this, "button $position is clicked",Toast.LENGTH_SHORT).show() }
  Toast.makeText(this, "not button clicked, works correctly", Toast.LENGTH_SHORT).show()
} 

启动时如何激活按钮onCreate(savedInstanceState: Bundle?)

我的科特林代码:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    var db = DataBaseHelper(this)
    var cursor = db.returnLines()

    listV.adapter = SimpleCursorAdapter(this,
        R.layout.view_holder,
        cursor,
        arrayOf("imia"),
        intArrayOf(R.id.listNameView),
        0)

    listV.setOnItemClickListener { parent, view, position, id ->

      //I tried you use comented line to solwe my problem
      //view.imageViewButton.setOnClickListener { Toast.makeText(this, "button $position is clicked",Toast.LENGTH_SHORT).show() }
      Toast.makeText(this, "not button clicked, $position works correctly", Toast.LENGTH_SHORT).show()
    }
}

标签: androidlistviewkotlin

解决方案


您可以扩展 SimpleCursorAdapter 以将点击侦听器设置为特定视图

class CustomAdapter(context: Context?, layout: Int, c: Cursor?, from: Array<out String>?, to: IntArray?) : SimpleCursorAdapter(context, layout, c, from, to) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        return super.getView(position, convertView, parent).apply {
            if (convertView == null) { // This means newView()
                findViewById<View>(R.id.image_view).setOnClickListener {
                    Toast.makeText(context, "image view clicked pos=$position")
                }
            }
        }
    }
}

但我建议你使用 RecyclerView 而不是 ListView。

ListView 是老式的,不推荐使用

希望能帮助到你 :)


推荐阅读