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