android - 如何从 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
}
}
}
推荐阅读
- javascript - 相邻兄弟选择器 element.querySelector("+element") 无效
- python - 查找分组列的唯一值?
- excel - 需要帮助简化或改进 excel 中的加权分布公式(数学/excel/编程菜鸟)
- c# - 在 C# Winform 中通过动作创建后调用对象
- html - 如何使文本在按钮中间居中?
- reactjs - React-Redux 中的减速器
- c# - asp.net 中的服务器端自定义验证器,当折扣适用下拉菜单为“是”时,文本框应该是强制性的,否则文本框不是强制性的
- java - 有什么方法可以获取 ENC 图层的所有功能并在 java 或 .net ArcGIS SDK 中切换它们的可见性?
- javascript - 在位掩码中打包和解包整数
- c++ - 如何提高BST的搜索操作效率?