Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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-如何将侦听器从片段传递到适配器?(科特林)_Android_Kotlin_Android Fragments_Android Recyclerview - Fatal编程技术网

android-如何将侦听器从片段传递到适配器?(科特林)

android-如何将侦听器从片段传递到适配器?(科特林),android,kotlin,android-fragments,android-recyclerview,Android,Kotlin,Android Fragments,Android Recyclerview,我目前正在使用一个具有设置活动的应用程序。在此设置活动中,有一个FrameLayout,用于加载包含RecyclerView的片段 在片段中,我必须向RecyclerView适配器传递一个侦听器,这是OnItemClick函数所需的。 我尝试使用context而不是this,但它不起作用 如何正确地将侦听器传递给适配器? 代码: 碎片设置.kt class FragmentSettingsMain : Fragment(), AdapterSettings.OnItemClickListener

我目前正在使用一个具有设置活动的应用程序。在此设置活动中,有一个FrameLayout,用于加载包含RecyclerView的片段

在片段中,我必须向RecyclerView适配器传递一个侦听器,这是OnItemClick函数所需的。 我尝试使用
context
而不是
this
,但它不起作用

如何正确地将侦听器传递给适配器?

代码:

碎片设置.kt

class FragmentSettingsMain : Fragment(), AdapterSettings.OnItemClickListener {
    val settingsList = listOf(
        DataItemsSettings(getString(R.string.look), getString(R.string.lookdescription), R.drawable.ic_colored_color_lens),
        DataItemsSettings(getString(R.string.playing), getString(R.string.playingdescription), R.drawable.ic_colored_view_carousel),
        DataItemsSettings(getString(R.string.images), getString(R.string.imagesdscription), R.drawable.ic_colored_image),
        DataItemsSettings(getString(R.string.audio), getString(R.string.audiodescription), R.drawable.ic_colored_volume_up),
        DataItemsSettings(getString(R.string.other), getString(R.string.otherdescription), R.drawable.ic_colored_shape),
        DataItemsSettings(getString(R.string.about), getString(R.string.aboutdescription), R.drawable.ic_colored_info)
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        retainInstance = true
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.fragment_settings_main, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        rvSettings.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = AdapterSettings(settingsList, NEEDS LISTENER HERE)
        }
    }

    override fun OnItemClick(position: Int) {
        when(position) {
            0 -> //Start new fragment here
            1 -> //Start new fragment here
            2 -> //Start new fragment here
            3 -> //Start new fragment here
            4 -> //Start new fragment here
            5 -> this.startActivity(Intent(this, ActivityAbout::class.java))
        }
    }
}
class AdapterSettings(
    var settingsList: List<DataItemsSettings>,
    var listener: OnItemClickListener
) : RecyclerView.Adapter<AdapterSettings.SettingsViewHolder>() {

    inner class SettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        init {
            itemView.setOnClickListener(this)
        }

        override fun onClick(p0: View?) {
            val position : Int = adapterPosition
            if (position != RecyclerView.NO_POSITION) {
                listener.OnItemClick(position)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingsViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_settings, parent, false)
        return SettingsViewHolder(view)
    }

    override fun getItemCount(): Int {
        return settingsList.size
    }

    override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
        holder.itemView.apply {
            rvTitle.text = settingsList[position].stringTitle
            rvDescription.text = settingsList[position].stringDescription
            rvIcon.setImageResource(settingsList[position].itemIcon)
        }
    }

    interface OnItemClickListener {
        fun OnItemClick(position: Int)
    }
}
适配器设置.kt

class FragmentSettingsMain : Fragment(), AdapterSettings.OnItemClickListener {
    val settingsList = listOf(
        DataItemsSettings(getString(R.string.look), getString(R.string.lookdescription), R.drawable.ic_colored_color_lens),
        DataItemsSettings(getString(R.string.playing), getString(R.string.playingdescription), R.drawable.ic_colored_view_carousel),
        DataItemsSettings(getString(R.string.images), getString(R.string.imagesdscription), R.drawable.ic_colored_image),
        DataItemsSettings(getString(R.string.audio), getString(R.string.audiodescription), R.drawable.ic_colored_volume_up),
        DataItemsSettings(getString(R.string.other), getString(R.string.otherdescription), R.drawable.ic_colored_shape),
        DataItemsSettings(getString(R.string.about), getString(R.string.aboutdescription), R.drawable.ic_colored_info)
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        retainInstance = true
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.fragment_settings_main, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        rvSettings.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = AdapterSettings(settingsList, NEEDS LISTENER HERE)
        }
    }

    override fun OnItemClick(position: Int) {
        when(position) {
            0 -> //Start new fragment here
            1 -> //Start new fragment here
            2 -> //Start new fragment here
            3 -> //Start new fragment here
            4 -> //Start new fragment here
            5 -> this.startActivity(Intent(this, ActivityAbout::class.java))
        }
    }
}
class AdapterSettings(
    var settingsList: List<DataItemsSettings>,
    var listener: OnItemClickListener
) : RecyclerView.Adapter<AdapterSettings.SettingsViewHolder>() {

    inner class SettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        init {
            itemView.setOnClickListener(this)
        }

        override fun onClick(p0: View?) {
            val position : Int = adapterPosition
            if (position != RecyclerView.NO_POSITION) {
                listener.OnItemClick(position)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingsViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_settings, parent, false)
        return SettingsViewHolder(view)
    }

    override fun getItemCount(): Int {
        return settingsList.size
    }

    override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
        holder.itemView.apply {
            rvTitle.text = settingsList[position].stringTitle
            rvDescription.text = settingsList[position].stringDescription
            rvIcon.setImageResource(settingsList[position].itemIcon)
        }
    }

    interface OnItemClickListener {
        fun OnItemClick(position: Int)
    }
}
类适配器设置(
变量设置列表:列表,
var侦听器:mclickListener
):RecyclerView.Adapter(){
内部类设置ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView),View.OnClickListener{
初始化{
itemView.setOnClickListener(此)
}
覆盖有趣的onClick(p0:视图?){
val位置:Int=适配器位置
如果(位置!=RecyclerView.无位置){
listener.mclick(位置)
}
}
}
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):设置ViewHolder{
val view=LayoutInflater.from(parent.context)。充气(R.layout.item_设置,parent,false)
返回设置查看文件夹(视图)
}
重写getItemCount():Int{
返回设置列表大小
}
覆盖BindViewHolder(holder:SettingsViewHolder,位置:Int){
holder.itemView.apply{
rvTitle.text=settingsList[position].stringTitle
rvDescription.text=settingsList[position].stringDescription
rvIcon.setImageResource(settingsList[position].itemIcon)
}
}
接口侦听器{
趣味mclick(位置:Int)
}
}

您可以将lambda传递给适配器,调用
adapter.onAction={}
当您处于应用块中时,要使用它,您需要在使用它的同时添加@FragmentSettingsMain

AdapterSettings(settingsList,this@FragmentSettingsMain)
或者你可以使用

val listener  = this
rvSettings.apply{
  AdapterSettings(settingsList,listener)
}