如何从recyclerview中的onclicklistener替换kotlin中的片段

时间:2019-05-05 03:20:10

标签: android-fragments kotlin android-recyclerview

当我单击recyclerView内的项目时,如何替换片段

我已经尝试在适配器的onClickListener内部

    childFragmentManager
                .beginTransaction()
                .replace(R.id.framefragment2, Fragment2())
                .commit()

如果没有成功,它将返回我

java.lang.IllegalArgumentException: No view found for id 0x7f0a0137 (com.test.justaapp:id/framefragment1) for fragment Fragmetnone{1ebd5fc #0 id=0x7f0a0137}

这是第一个片段的mi xml已经被夸大了

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/framefragment1"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

和第二帧布局

<FrameLayout 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:background="#C0C0C0">

    <FrameLayout
        android:id="@+id/framefragment2"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

我一直在搜索几个小时,无法正常工作,有什么想法吗?也许我在说些简单的东西,对您的帮助会很高兴。

1 个答案:

答案 0 :(得分:0)

您可以在ViewHolder上实现一个接口,然后从活动中将此接口的实现传递给适配器。在适配器中,您可以在创建CustomViewHolder实例(创建方法)时传递实现。

在您的活动/片段中:

private val adapter = YourAdapter(object: CustomViewHolder.Listener {
    fun onClick() {
        // change the fragment here with the fragment manager of your activity/fragment.
    }
})

在适配器中:

class YourAdapter(private val listener: CustomViewHolder.Listener): RecyclerView.Adapter {

    ...

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return CustomViewHolder(
            LayoutInflater.from(context).inflate(R.layout.view_layout, parent, false), 
            listener
        )
    }
}

ViewHolder实现:

class CustomViewHolder(view: View, private val listener: Listener): ViewHolder(view) {

    ...    

    interface Listener {
        fun onClick()
    }

    fun onCreate(parent: View, listener: Listener): CustomViewHolder {
        // inflate the view and return an instance of CustomViewHolder
    }

    fun onBind() {
        button.setOnClickListener {
            listener.onClick()
        }
    }    
}

我没有测试这段代码,但是逻辑就在这里。您只需要使其适应您的项目即可。