繁体   English   中英

如何从 Kotlin 中的适配器调用片段的函数?

[英]How to call a fragment's function from adapter in 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
    }
.
.
.

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

你应该:

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
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM