Android-从片段到适配器的侦听器值?

Android-从片段到适配器的侦听器值?,android,android-fragments,Android,Android Fragments,我正在开发一个应用程序,它的片段中有一个RecyclerView。我的目标是通过适配器设置onClickItemListener 但是,设置它时遇到了一个问题:当我调用适配器时,我必须输入两个参数,即我需要应用的列表和侦听器 如果我把这个作为侦听器,我会得到一个类型不匹配错误 我可以用什么来代替此? Fragment.kt class FragmentItems : Fragment() { var itemList = mutableListOf<DataItems>()

我正在开发一个应用程序,它的片段中有一个RecyclerView。我的目标是通过适配器设置onClickItemListener

但是,设置它时遇到了一个问题:当我调用适配器时,我必须输入两个参数,即我需要应用的列表和侦听器

如果我把
这个
作为侦听器,我会得到一个类型不匹配错误

我可以用什么来代替此

Fragment.kt

class FragmentItems : Fragment() {
    var itemList = mutableListOf<DataItems>()

    ....

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

        ....

        rvTracks.apply {
            setHasFixedSize(true)
            layoutManager = LinearLayoutManager(activity)
            
            //Cant use 'this'!
            adapter = AdapterList(itemList, this)
        }
    }
}
class AdapterList(
    var listItems: List<DataItems>,
    var listener: OnItemClickListener
) : RecyclerView.Adapter<AdapterOneColumn.ItemsViewHolder>() {

    inner class ItemsViewHolder(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): ItemsViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_1_column, parent, false)
        return ItemsViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: ItemsViewHolder, position: Int) {
        holder.itemView.apply {
            itemOneColumnTitle.text = listItems[position].stringTitle
            itemOneColumnDescription.text = listItems[position].stringDescription
        }
    }

    interface OnItemClickListener {
        fun OnItemClick(position: Int)
    }
}
class FragmentItems:Fragment(){
var itemList=mutableListOf()
....
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
....
rvTracks.apply{
setHasFixedSize(真)
layoutManager=LinearLayoutManager(活动)
//不能用“这个”!
适配器=适配器列表(项目列表,此)
}
}
}
适配器.kt

class FragmentItems : Fragment() {
    var itemList = mutableListOf<DataItems>()

    ....

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

        ....

        rvTracks.apply {
            setHasFixedSize(true)
            layoutManager = LinearLayoutManager(activity)
            
            //Cant use 'this'!
            adapter = AdapterList(itemList, this)
        }
    }
}
class AdapterList(
    var listItems: List<DataItems>,
    var listener: OnItemClickListener
) : RecyclerView.Adapter<AdapterOneColumn.ItemsViewHolder>() {

    inner class ItemsViewHolder(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): ItemsViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_1_column, parent, false)
        return ItemsViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: ItemsViewHolder, position: Int) {
        holder.itemView.apply {
            itemOneColumnTitle.text = listItems[position].stringTitle
            itemOneColumnDescription.text = listItems[position].stringDescription
        }
    }

    interface OnItemClickListener {
        fun OnItemClick(position: Int)
    }
}
类适配器列表(
var listItems:List,
var侦听器:mclickListener
):RecyclerView.Adapter(){
内部类ItemsViewHolder(itemView:View):RecyclerView.ViewHolder(itemView),View.OnClickListener{
初始化{
itemView.setOnClickListener(此)
}
覆盖有趣的onClick(p0:视图?){
val位置:Int=适配器位置
如果(位置!=RecyclerView.无位置){
listener.mclick(位置)
}
}
}
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):ItemsViewHolder{
val view=LayoutInflater.from(parent.context).充气(R.layout.item_1_列,parent,false)
返回项目查看文件夹(视图)
}
重写getItemCount():Int{
返回listItems.size
}
覆盖onBindViewHolder(holder:ItemsViewHolder,位置:Int){
holder.itemView.apply{
itemOneColumnTitle.text=listItems[position].stringTitle
itemOneColumnDescription.text=listItems[position].stringDescription
}
}
接口侦听器{
趣味mclick(位置:Int)
}
}

如果你想让这一切顺利进行

adapter = AdapterList(itemList, this)
您的类应该实现您想要传递的
OnItemClickListener
,您可以通过以下方式修复它:

class FragmentItems : Fragment(), OnItemClickListener { ...

如果
FragmentItems
正在实现
OnItemClickListener
,您应该能够传递对
FragmentItems
的引用,否则实现该接口的任何内容都是您必须传递的内容尝试您的解决方案似乎几乎正确。。。我仍然使用“this”得到一个类型不匹配。您应该意识到片段中相应的
OnItemClickListener
,我认为在您的示例中应该是
View.OnItemClickListener
No,应该是
class FragmentItems:fragment(),AdapterList.OnItemClickListener
是的,它是AdapterList.OnItemClickListener。尽管即使添加了该函数和必需的函数OnItemClick,适配器仍然要求侦听器。把“这个”,再给一个类型mismatch@Meltix,除了在
rvTracks.apply{}
中之外,这个
指的是
rvTracks
,我认为它是RecyclerView,而不是
FragmentItems
。您应该使用
adapter=AdapterList(itemList,this@FragmentItems)