首页 > 解决方案 > 如何从 Kotlin 中的适配器调用片段的函数?

问题描述

我是 Kotlin android 开发的初学者,无法从适配器调用片段函数。按照这种方法,我写了下面的代码,但仍然没有运气。

适配器代码

class CallItemAdapter(
    val context: Context,
    private val callItems: List<CallItem>,
    private val listener: ClickListener
) : RecyclerView.Adapter<CallItemAdapter.MyViewHolder>() {
    interface ClickListener {
        fun onClickListener(item: CallItem)
    }

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

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val callItem = callItems[position]
        holder.setData(callItem, position, listener)
    }

    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private var currentCallItem: CallItem? = null
        private var currentPosition: Int = 0

        init {
            itemView.btnCall.setOnClickListener {
               // TODO 
            }
        }

        fun setData(callItem: CallItem?, position: Int, listener: ClickListener) {
            itemView.txtPersonName.text = callItem!!.name
            itemView.txtTask.text = callItem.task
            itemView.setOnClickListener {
                listener.onClickListener(callItem)
            }

            this.currentCallItem = callItem
            this.currentPosition = position
        }
    }
}

片段代码

class CallingWorkFragment : Fragment(), CallItemAdapter.ClickListener {
    override fun onClickListener(item: CallItem) {
        println("Interface working")
        context!!.applicationContext.showToast("Wubba lubba dub dub")
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_work_calling, container, false)
    }

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

        val callItems: MutableList<CallItem> = ArrayList()

        val adapter = CallItemAdapter(activity!!.applicationContext, callItems, this)
        recyclerViewCallItem.adapter = adapter
    }
.
.
.

但点击时什么都没有发生。请让我知道我做错了什么。编辑:我添加了完整的适配器代码。

标签: androidandroid-fragmentskotlin

解决方案


你应该:

class CallItemAdapter(
    val context: Context,
    private val callItems: List<CallItem>,
    private val listener: ClickListener
    ) : RecyclerView.Adapter<CallItemAdapter.MyViewHolder>() {
    interface ClickListener {
        fun onClickListener(item: CallItem)
    }

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

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val callItem = callItems[position]
        holder.setData(callItem, position)

        holder.itemView.setOnClickListener {
            listener.onClickListener(callItem)
        }

        // or 
        holder.itemView.btnCall.setOnClickListener {
            // TODO 
        }
    }

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private var currentCallItem: CallItem? = null
        private var currentPosition: Int = 0

        fun setData(callItem: CallItem?, position: Int) {
            itemView.txtPersonName.text = callItem!!.name
            itemView.txtTask.text = callItem.task

            this.currentCallItem = callItem
            this.currentPosition = position
        }
    }
}

推荐阅读