Android 在RecyclerView中单击项目时碎片不会膨胀
所以我正在用Kotlin构建一个标准的Android应用程序。我的应用程序实现了一个TableAyout,其中一个选项卡包含一个RecyclerView列表 现在,这似乎很简单,我不知道为什么它不起作用。当我单击列表中的一个项目时,侦听器是有响应的(因为我做了一些日志测试),但是与该项目相关联的片段不会膨胀 在片段列表的OnCreateView()中,我在其中实现了我的RecyclerView,我用以下方式指示侦听器:Android 在RecyclerView中单击项目时碎片不会膨胀,android,android-studio,android-fragments,kotlin,Android,Android Studio,Android Fragments,Kotlin,所以我正在用Kotlin构建一个标准的Android应用程序。我的应用程序实现了一个TableAyout,其中一个选项卡包含一个RecyclerView列表 现在,这似乎很简单,我不知道为什么它不起作用。当我单击列表中的一个项目时,侦听器是有响应的(因为我做了一些日志测试),但是与该项目相关联的片段不会膨胀 在片段列表的OnCreateView()中,我在其中实现了我的RecyclerView,我用以下方式指示侦听器: //Give action to item click in ada
//Give action to item click in adapter
adapter.onItemClick = {
//Setup new fragment Item
val newFragment = ItemFragment()
// parentFragmentManager is the same as activity?.supportFragmentManager
parentFragmentManager.beginTransaction()
.replace(R.id.list_fragment_id, newFragment)
.addToBackStack(null) //Makes it possible to comeback to recyclerview
.commit()
}
我认为我的错误在当前容器的ID附近,因为应用程序是在TabLayout中设置的。我曾尝试使用我的查看页面的ID,甚至是RecyclerView,但似乎没有成功
任何帮助都会非常有用 尝试以下代码,这些代码已经在java中由您自己将其转换为kotlin:) 首先在适配器中声明var
Fragment fragment = null;
FragmentManager fragmentManager;
FragmentTransaction fragmentTransaction;
在onclick方法中添加以下代码之后
fragment = new CategoryFragment();
fragmentManager = ((FragmentActivity)getContext()).getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frameLayoutHome, fragment);
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.commit();
而不是
adapter.onItemClick=…
您应该将click listener放在ViewHolder视图上
适配器类
override fun onCreateViewHolder(parent:ViewGroup, viewType:Int):MyViewHolder{
{
return MyViewHolder(view, myClickListener)
}
class MyViewHolder : ViewHolder(v:View, myClickListener:ClickListener?) {
itemView.onClick = { myClickListener?.clicked() };
}
视图持有者类别
override fun onCreateViewHolder(parent:ViewGroup, viewType:Int):MyViewHolder{
{
return MyViewHolder(view, myClickListener)
}
class MyViewHolder : ViewHolder(v:View, myClickListener:ClickListener?) {
itemView.onClick = { myClickListener?.clicked() };
}
最后我自己找到了答案:') 它确实存在于你观点的容器中
.replace(R.id.list\u fragment\u id,newFragment)
不起作用,因为不能用布局替换片段,需要用视图来完成
.replace(R.id.viewPager,newFragment)
不起作用,因为viewPager是表示所有正在查看的片段的视图,而不仅仅是您正在查找的片段
.replace(R.id.recyclerview,newFragment)
无法保存另一个片段
因此,我将我的recyclerview嵌套在一个RelativeLayout中的XML文件中,该RelativeLayout表示我们希望用其替换片段的实际容器
它应该是这样的:
<RelativeLayout
android:id="@+id/recyclerview_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
tools:listitem="@layout/recyclerview_item"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</RelativeLayout>
如果我犯了错误,请告诉我 使用holder.your_text_view.setOnClick listener在回收器视图适配器的onBindViewHolder中添加onclick侦听器它已经被处理了。我可以对它进行扩展,因为这是我进行的最清晰的方式:我添加了一个属性var-onItemClick:((作品)->Unit)?=我的适配器类为null,并且在我的ViewHolder内部类(适配器类)中添加了一个init,其形式为://action ockes init{itemView.setOnClickListener{onItemClick?.invoke(itemList[adapterPosition])}这一部分对我来说非常棒,我毫不怀疑这不是问题:)嘿,谢谢你的回答:)不幸的是,它没有工作。你的片段管理器和我的一样,我添加了setTransition,但我仍然没有成功。。。我认为关键在于片段事务的replace函数。我觉得我没有使用正确的ID来替换。因为我不能100%确定当前容器是来自我的tablayout的我的视图分页器还是我的recylcerview,甚至是我与recyclerview(以及特定选项卡)关联的片段