Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在RecyclerView中单击项目时碎片不会膨胀_Android_Android Studio_Android Fragments_Kotlin - Fatal编程技术网

Android 在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

所以我正在用Kotlin构建一个标准的Android应用程序。我的应用程序实现了一个TableAyout,其中一个选项卡包含一个RecyclerView列表

现在,这似乎很简单,我不知道为什么它不起作用。当我单击列表中的一个项目时,侦听器是有响应的(因为我做了一些日志测试),但是与该项目相关联的片段不会膨胀

在片段列表的OnCreateView()中,我在其中实现了我的RecyclerView,我用以下方式指示侦听器:

    //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(以及特定选项卡)关联的片段