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
}
}以上です