前提・実現したいこと
Fragment上にあるRecyclerViewのロングタップで画面中央にメニューを表示し、対象データの編集や削除を行いたいと考えています。
メニューのイメージとしては、LINEのトーク一覧でロングタップした際に表示されるメニュー(非表示、通知オフ…)を考えています。
該当のソースコード
ListFragment
1class ListFragment : Fragment() { 2 private var _binding: FragmentListBinding? = null 3 private val binding get() = _binding!! 4 5 private lateinit var realm: Realm 6 7 override fun onCreate(savedInstanceState: Bundle?) { 8 super.onCreate(savedInstanceState) 9 10 realm = Realm.getDefaultInstance() 11 } 12 13 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 14 super.onViewCreated(view, savedInstanceState) 15 16 binding.list.layoutManager = LinearLayoutManager(context) 17 val adapter = ListAdapter(realm.where<List>().findAll()) 18 binding.list.adapter = adapter 19 20 adapter.setOnClickListener { id -> 21 id?.let { 22 Toast.makeText(activity, "Click $it", Toast.LENGTH_SHORT).show() 23 } 24 } 25 adapter.setOnLongClickListener { id -> 26 id?.let { 27 Toast.makeText(activity, "LongClick $it", Toast.LENGTH_SHORT).show() 28 } 29 } 30 } 31 32 override fun onDestroyView() { 33 super.onDestroyView() 34 _binding= null 35 } 36 37 override fun onDestroy() { 38 super.onDestroy() 39 realm.close() 40 } 41}
ListAdapter
1class ListAdapter(data: OrderedRealmCollection<List>) : 2 RealmRecyclerViewAdapter<List, ListAdapter.ViewHolder>(data, true) { 3 4 private var clickListener: ((Long?) -> Unit)? = null 5 private var longClickListener: ((Long?) -> Unit)? = null 6 7 fun setOnClickListener(clickListener: (Long?) -> Unit) { 8 this.clickListener = clickListener 9 } 10 11 fun setOnLongClickListener(longClickListener: (Long?) -> Unit) { 12 this.longClickListener = longClickListener 13 } 14 15 init { 16 setHasStableIds(true) 17 } 18 19 class ViewHolder(cell: View) : RecyclerView.ViewHolder(cell) { 20 val image: ImageView = cell.findViewById(R.id.image) 21 val text: TextView = cell.findViewById(R.id.text) 22 } 23 24 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 25 val inflater = LayoutInflater.from(parent.context) 26 val view = inflater.inflate(R.layout.list_layout, parent, false) 27 28 return ViewHolder(view) 29 } 30 31 override fun onBindViewHolder(holder: ViewHolder, position: Int) { 32 val list: List? = getItem(position) 33 holder.text.text = list?.text 34 35 holder.itemView.setOnClickListener { 36 clickListener?.invoke(list?.id) 37 } 38 39 holder.itemView.setOnLongClickListener { 40 longClickListener?.invoke(list?.id) 41 true 42 } 43 } 44 45 override fun getItemId(position: Int): Long { 46 return getItem(position)?.id ?: 0 47 } 48}
試したこと
試行錯誤してActivity や Fragment 、 Adapter に registerForContextMenu をコーディングしてみたのですが onCreateContextMenu が動いてくれませんでした。
勉強中のため的を射ない内容が含まれていた時は申し訳ありません。
初歩的な質問で恐縮ですが、どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー