前提・実現したいこと
閲覧ありがとうございます。
AndroidStudioにてAndroidアプリの開発中ですが、RecyclerView内のViewにクリックイベントが適用できず困っています。
言語はKotlinです。
発生している問題・エラーメッセージ
下記のソースのようにしてRecyclerAdapter内でViewへOnClickListenerを設定しているのですが、一切反応を起こしません。エラー等も出るわけではなく、Logも出力されません。
該当のソースコード
RecyclerViewのItemレイアウト(rec_item.xml)
xml
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="wrap_content" 7 android:background="@android:color/transparent" 8 android:clickable="true" 9 android:focusable="auto"> 10 11 <androidx.cardview.widget.CardView 12 android:id="@+id/card_com" 13 android:layout_width="match_parent" 14 android:layout_height="match_parent" 15 android:clickable="true" 16 app:cardCornerRadius="6dp" 17 app:cardElevation="4dp"> 18 19 <LinearLayout 20 android:layout_width="match_parent" 21 android:layout_height="match_parent" 22 android:clickable="true" 23 android:orientation="vertical"> 24 25 <LinearLayout 26 android:layout_width="match_parent" 27 android:layout_height="wrap_content" 28 android:layout_marginStart="4dp" 29 android:clickable="true" 30 android:gravity="center_vertical" 31 android:orientation="horizontal"> 32 33 <TextView 34 android:id="@+id/txt_title" 35 android:layout_width="0dp" 36 android:layout_height="wrap_content" 37 android:layout_weight="5" 38 android:text="TextView" 39 android:textColor="@color/black" 40 android:textSize="24sp" /> 41 42 <Button 43 android:id="@+id/btn_open_detail" 44 android:layout_width="0dp" 45 android:layout_height="wrap_content" 46 android:layout_weight="1" 47 android:clickable="true" 48 android:focusable="auto" /> 49 </LinearLayout> 50 51 <View 52 android:id="@+id/line_color" 53 android:layout_width="match_parent" 54 android:layout_height="4dp" 55 android:background="@color/colorAccent" /> 56 57 <androidx.constraintlayout.widget.ConstraintLayout 58 android:id="@+id/container_detail" 59 android:layout_width="match_parent" 60 android:layout_height="wrap_content" 61 android:clickable="true" 62 android:visibility="gone"> 63 64 <TextView 65 android:id="@+id/txt_detail" 66 android:layout_width="0dp" 67 android:layout_height="wrap_content" 68 android:text="detail" 69 app:layout_constraintStart_toStartOf="parent" 70 app:layout_constraintEnd_toEndOf="parent" 71 app:layout_constraintTop_toTopOf="parent" /> 72 73 </androidx.constraintlayout.widget.ConstraintLayout> 74 </LinearLayout> 75 </androidx.cardview.widget.CardView> 76</LinearLayout>
Fragmentのレイアウト(my_fragment)
xml
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/my_parent" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".views.MyFragment" > 9 10 <androidx.appcompat.widget.Toolbar 11 android:id="@+id/toolbar" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 android:background="@color/colorPrimary" 15 android:minHeight="?attr/actionBarSize" 16 android:theme="?attr/actionBarTheme" 17 app:layout_constraintEnd_toEndOf="parent" 18 app:layout_constraintStart_toStartOf="parent" 19 app:layout_constraintTop_toTopOf="parent" /> 20 21 <androidx.recyclerview.widget.RecyclerView 22 android:id="@+id/recycler" 23 android:layout_width="0dp" 24 android:layout_height="0dp" 25 app:layout_constraintBottom_toBottomOf="parent" 26 app:layout_constraintEnd_toEndOf="parent" 27 app:layout_constraintStart_toStartOf="parent" 28 app:layout_constraintTop_toBottomOf="@+id/toolbar" /> 29 30</androidx.constraintlayout.widget.ConstraintLayout>
リサイクラーのアダプタ(MyRecyclerAdapter.kt)
kotlin
1class MyRecyclerAdapter(private val fragment: Fragment, private val data: MutableList<String>) : RecyclerView.Adapter<MyRecyclerAdapter.MyRecyclerViewHolder>() { 2 3 class MyRecyclerViewHolder(val view: View) : RecyclerView.ViewHolder(view) { 4 val titleText: TextView = view.txt_title 5 val detailText: TextView = view.txt_detail 6 val openDetailButton: Button = view.btn_open_detail 7 val detailContainer: View = view.container_detail 8 } 9 10 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyRecyclerViewHolder { 11 return MyRecyclerViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.rec_item, parent, false)) 12 } 13 14 override fun onBindViewHolder(holder: MyRecyclerViewHolder, position: Int) { 15 val item = data[position] 16 holder.apply { 17 titleText.text = position.toString() 18 detailText.text = item 19 //詳細オープンボタンのセット 20 //クリックが反応しない 21 openDetailButton.setOnClickListener { 22 Log.d("mytest", "openDetailButton is clicked.") //出力されていないのでまずこのブロックに入ってない 23 when(detailContainer.visibility){ 24 View.VISIBLE -> detailContainer.visibility = View.GONE 25 View.GONE -> detailContainer.visibility = View.VISIBLE 26 } 27 } 28 } 29 } 30 31 override fun getItemCount(): Int = data.size
フラグメント(MyFragment.kt)
kotlin
1class MyFragment : Fragment() { 2 3 private lateinit var mAdapter: MyRecyclerAdapter 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 arguments?.let {} 8 } 9 10 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { 11 // Inflate the layout for this fragment 12 return inflater.inflate(R.layout.my_fragment, container, false) 13 } 14 15 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 16 super.onViewCreated(view, savedInstanceState) 17 18 mAdapter = MyRecyclerAdapter(this, listOf("A","B","C")) 19 recycler.apply { 20 layoutManager = LinearLayoutManager(activity) 21 adapter = mAdapter 22 } 23 } 24 25 companion object { 26 fun newInstance() = 27 CommunityFragment().apply { 28 arguments = Bundle().apply { } 29 } 30 } 31}
試したこと
xmlファイル内でclickable属性をつけたり外したり、onClickListenerをフラグメントから渡したりしましたが、いまいち何が原因なのかがわからないため困っています。
原因がわかる方いらっしゃいましたら、よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。