android ListViewでContextMenuを使う

今回やりたかったことは、ListViewの各行を長押ししたらコンテキストメニューを表示して選択されたメニューによって処理を行うということ

http://kimagureneet.hatenablog.com/entry/2019/02/19/031844
ListViewはこちらに書いたものを使用する

registerForContextMenuでListViewを設定するとonCreateContextMenuが呼ばれるのでこれをオーバーライドしてメニューアイテムを表示するだけだと思っていたらonCreateContextMenuが呼ばれずにハマった...解決策はListViewの行アイテムにisLongClickable = trueをセットすることでした

MainActivity.kt

class MainActivity : AppCompatActivity() {

  ・・・

  override fun onCreate(savedInstanceState: Bundle?) {
    ・・・

    // ListViewにContextMenuを登録
    registerForContextMenu(listView)
  }

  override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
    super.onCreateContextMenu(menu, v, menuInfo)

    val info = menuInfo as AdapterView.AdapterContextMenuInfo
    menuInflater.inflate(R.menu.comment_context, menu)
  }

  override fun onContextItemSelected(item: MenuItem?): Boolean {
    val menuInfo = item!!.menuInfo as AdapterView.AdapterContextMenuInfo

    // メニューを表示した行番号を取得
    // menuInfo.position

    when(item.itemId) {
      R.id.edit -> {
        // 編集
      }
      R.id.delete -> {
        // 削除
      }
    }

    return true
  }
}

res/menu/user_context.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
  <item android:id="@+id/edit"
        android:title="編集"/>
  <item android:id="@+id/delete"
        android:title="削除"/>
</menu>

Adapter/UserAdapter.kt

class UserAdapter(val context: Context, val users: List<User>): BaseAdapter() {

  ・・・

  override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
    val view = layoutInflater.inflate(R.layout.user_item, parent, false)

    ・・・

    // ★長押しを有効化
    view.isLongClickable = true

    return view
  }
}

以上です