【发布时间】:2017-05-25 20:29:49
【问题描述】:
我已经为我的 RecyclerView 设置了一个 ItemClickLister,如下所示:
ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener(
object : ItemClickSupport.OnItemClickListener {
override fun onItemClicked(recyclerView: RecyclerView?, position: Int, v: View?) {
val row = recyclerView!!.getChildAt(position)
val el = row.findViewById(R.id.active_expandablelayout) as ExpandableLayout
if (el.isExpanded) {
el.collapse()
} else {
el.expand()
}
}
}
)
使用我翻译成 Kotlin 的 ItemClickSupport 库。
我在object(第 2 行)收到一条错误消息:
对象必须声明为抽象或实现抽象成员。
我真的是 Kotlin 的新手,在 SO 上也找不到任何解决方案。
非常感谢任何帮助。
编辑:
这是我的ItemClickSupport.kt:
class ItemClickSupport private constructor(private val mRecyclerView: RecyclerView) {
private var mOnItemClickListener: OnItemClickListener? = null
private var mOnItemLongClickListener: OnItemLongClickListener? = null
private val mOnClickListener = View.OnClickListener { v ->
if (mOnItemClickListener != null) {
val holder = mRecyclerView.getChildViewHolder(v)
mOnItemClickListener!!.onItemClicked(mRecyclerView, holder.adapterPosition, v)
}
}
private val mOnLongClickListener = View.OnLongClickListener { v ->
if (mOnItemLongClickListener != null) {
val holder = mRecyclerView.getChildViewHolder(v)
return@OnLongClickListener mOnItemLongClickListener!!.onItemLongClicked(mRecyclerView, holder.adapterPosition, v)
}
false
}
private val mAttachListener = object : RecyclerView.OnChildAttachStateChangeListener {
override fun onChildViewAttachedToWindow(view: View) {
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener)
}
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener)
}
}
override fun onChildViewDetachedFromWindow(view: View) {
}
}
init {
mRecyclerView.setTag(R.id.item_click_support, this)
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener)
}
fun setOnItemClickListener(listener: OnItemClickListener): ItemClickSupport {
mOnItemClickListener = listener
return this
}
fun setOnItemLongClickListener(listener: OnItemLongClickListener): ItemClickSupport {
mOnItemLongClickListener = listener
return this
}
private fun detach(view: RecyclerView) {
view.removeOnChildAttachStateChangeListener(mAttachListener)
view.setTag(R.id.item_click_support, null)
}
interface OnItemClickListener {
fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View)
}
interface OnItemLongClickListener {
fun onItemLongClicked(recyclerView: RecyclerView, position: Int, v: View): Boolean
}
companion object {
fun addTo(view: RecyclerView): ItemClickSupport {
var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport
if (support == null) {
support = ItemClickSupport(view)
}
return support
}
fun removeFrom(view: RecyclerView): ItemClickSupport {
val support = view.getTag(R.id.item_click_support) as ItemClickSupport
support?.detach(view)
return support
}
}
}
这是一个包含整个错误及其发生位置的屏幕截图:
【问题讨论】:
-
您遗漏了以下信息:1)OnItemClickedListener的接口定义,分享一下,我们不要猜测,它应该在问题中。 2)您遗漏了完整的错误消息,它抱怨的成员名称未实现(以防万一您在该界面中做了一些我们看不到的事情)。 3) 如果您按照以下答案之一的建议使用 lambda 版本,它会告诉您发生了什么,但如果没有原始界面,我们无法告诉您如何解释。
-
@JaysonMinard 请查看更新后的问题
-
谢谢,现在我们有了回答问题所需的信息。该实现的 Java 版本将不同于用 Kotlin 编写的相同内容,因为 Kotlin 更具体地与 Kotlin 代码交谈,而在与 Java 代码交谈时则更宽松一些。
标签: android android-recyclerview kotlin