RecyclerView的Adapter点击事件在Activity正常,Fragment中失效求助
你的问题核心是布局层级错误导致Fragment中的RecyclerView被DrawerLayout遮挡,点击事件根本无法传递到RecyclerView的子View上。另外还有一些细节可以优化,下面一步步解决:
1. 修复Activity布局的DrawerLayout结构
DrawerLayout的正确用法是作为根布局,内部包含两个核心部分:主内容区域(第一个子View)和侧边栏(带layout_gravity属性的子View)。你当前的RelativeLayout根布局把FrameLayout和DrawerLayout平级放置,且DrawerLayout在FrameLayout之后定义,导致它直接覆盖在Fragment的内容之上,拦截了所有点击事件。
修正后的activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/myDrawerLayout" tools:openDrawer="start" android:fitsSystemWindows="true"> <!-- 主内容区域 --> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0068FF" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/myToolbar" android:background="#EF30"/> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/myFrameLayoutMain" android:background="#61C224" android:layout_below="@id/myToolbar"/> </RelativeLayout> <!-- 侧边栏NavigationView --> <android.support.design.widget.NavigationView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/myNavigationView" android:layout_gravity="start" android:fitsSystemWindows="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#FE7"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="My Text in NavigationView" android:textSize="25sp" android:textStyle="bold" android:layout_margin="10dp" android:gravity="center"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#EC67"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/myRecyclerView" android:layout_gravity="center" android:background="#000000"/> </LinearLayout> </LinearLayout> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>
2. 优化Fragment中Adapter的Context传递
在Fragment中直接使用activity作为Context可能会导致空指针风险(比如Fragment detached后),建议替换为更安全的requireContext():
// MainFragment.kt var myAdapter = MyAdapterMain(requireContext(), MyDataClass.DataProducer.MyList)
3. 优化Adapter点击事件的位置获取
你的Adapter点击事件写法本身没问题,但可以优化位置获取逻辑,避免使用过时的adapterPosition,改用更可靠的bindingAdapterPosition,同时增加无效位置判断:
// MyAdapterMain.kt myCircleImgView.setOnClickListener { val position = bindingAdapterPosition if (position != RecyclerView.NO_POSITION) { Toast.makeText(context, "Clicked Position\n\t\t\t\t$position", Toast.LENGTH_SHORT).show() Log.d("MyAdapterMain", "Clicked position: $position") } }
为什么Activity里的RecyclerView能正常点击?
因为Activity里的RecyclerView是放在NavigationView内部的,属于DrawerLayout的侧边栏部分,没有被其他控件遮挡,所以点击事件能正常触发。而Fragment的RecyclerView在FrameLayout中,被上层的DrawerLayout完全挡住了,自然无法响应点击。
内容的提问来源于stack exchange,提问作者Siyamak

