【发布时间】:2021-04-20 23:51:19
【问题描述】:
只是让您知道,我对 Kotlin 还很陌生,但我对 Java 有很好的体验。 我在一个活动中有两个回收器视图,具有相同的适配器,但行为不同。在 Java 中,只需在适配器类中创建一个接口并使用方法 setOnItemClick(OnClick onClick) 覆盖它,但在 Kotlin 中,情况似乎有所不同。 我看到人们在活动中覆盖了界面,这只会作为一种行为...... 有什么建议吗?
更新:见下面的代码:
适配器类:
class RoleAdapter(context : Context, list : ArrayList<Role>) : RecyclerView.Adapter<RoleAdapter.MyViewHolder>() {
private var list : ArrayList<Role>? = null
private var context : Context? = null
private var listener : OnItemClick? = null
/**
* Handle click events on Items.
* @see RoleAdapter
*/
interface OnItemClick {
fun onClick(position : Int)
fun onHold(position: Int) : Boolean
}
/**
* Return the current list of items displayed
*/
fun getList() : ArrayList<Role> = list!!
init {
this.list = list
this.context = context
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(
LayoutInflater.from(parent.context).
inflate(R.layout.item_role,parent,false)
)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val item : Role = list!![position]
holder.icon.setImageDrawable(Icons.getDrawableIcon(icon = item.getIcon()!!, context = context!!))
holder.text.text = item.getName()
holder.itemView.setOnClickListener {
if (listener != null) listener!!.onClick(holder.adapterPosition)
}
holder.itemView.setOnLongClickListener{
if (listener != null) listener!!.onHold(holder.adapterPosition)
return@setOnLongClickListener true
}
}
override fun getItemCount(): Int {
return list!!.size
}
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val icon : ImageView = itemView.findViewById(R.id.item_icon)
val text : TextView = itemView.findViewById(R.id.item_text)
}
/**
* Override the adapter's listener with a new one.
* @param listener new listener
*/
fun setListener(listener : OnItemClick){
this.listener = listener
}
/**
* Add an element to the list displayed by the adapter
* @param item item to insert
* @param position insertion position
*/
fun addItem(item : Role, position: Int){
list!!.add(item)
notifyItemInserted(position)
}
/**
* Remove an element from the list displayed by the adapter
* @param position position of the item to be removed
*/
fun removeItem(position : Int){
list!!.removeAt(position)
notifyItemRemoved(position)
}
}
活动
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_new_game)
currentPlayersRV = findViewById(R.id.current_players_rv)
availableRolesRV = findViewById(R.id.roles_rv)
currentPlayersAdapter = RoleAdapter(context = applicationContext, list = ArrayList<Role>())
currentPlayersAdapter!!.setListener(INSERT_LISTENER_1)
currentPlayersRV!!.layoutManager = GridLayoutManager(baseContext,3)
currentPlayersRV!!.adapter = currentPlayersAdapter
availableRolesAdapter = RoleAdapter(context = applicationContext, list = Role.getRoles(applicationContext))
availableRolesAdapter!!.setListener(INSERT_LISTENER_2)
availableRolesRV!!.layoutManager = GridLayoutManager(baseContext, 3)
availableRolesRV!!.adapter = availableRolesAdapter
}
【问题讨论】:
-
接口在 Kotlin 和 Java 中的行为方式相同,但 Kotlin 还提供了一种通过委托给实现该接口的另一个对象来实现接口的方法。不过听起来不像你描述的那样。我们必须看看你在说什么的例子。
-
我马上更新。
-
如果您还在这里,请更新...
标签: android kotlin android-recyclerview interface