Android 在同一活动中使用接口两次
只是想让你知道,我对Kotlin很陌生,但我对Java有很好的经验。 我在一个活动中有两个recycler视图,它们具有相同的适配器,但行为不同。在Java中,只需在适配器类中创建一个接口,并使用方法setOnItemClick(OnClick-OnClick)覆盖它,但在Kotlin中,情况似乎有所不同。 我看到人们在活动中重写了接口,这将仅作为一种行为。。。 有什么建议吗 更新:见下面的代码: 适配器类:Android 在同一活动中使用接口两次,android,kotlin,android-recyclerview,interface,Android,Kotlin,Android Recyclerview,Interface,只是想让你知道,我对Kotlin很陌生,但我对Java有很好的经验。 我在一个活动中有两个recycler视图,它们具有相同的适配器,但行为不同。在Java中,只需在适配器类中创建一个接口,并使用方法setOnItemClick(OnClick-OnClick)覆盖它,但在Kotlin中,情况似乎有所不同。 我看到人们在活动中重写了接口,这将仅作为一种行为。。。 有什么建议吗 更新:见下面的代码: 适配器类: class RoleAdapter(context : Context, list :
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)
}
}
classroleadapter(context:context,list:ArrayList):RecyclerView.Adapter(){
私有变量列表:ArrayList?=null
私有变量上下文:上下文?=null
私有变量侦听器:OnItemClick?=null
/**
*处理项目上的单击事件。
*@见RoleDapter
*/
界面单击{
趣味onClick(位置:Int)
乐趣保持(位置:Int):布尔值
}
/**
*返回当前显示的项目列表
*/
fun getList():ArrayList=list!!
初始化{
this.list=list
this.context=context
}
重写CreateViewHolder(父级:ViewGroup,viewType:Int):MyViewHolder{
返回MyViewHolder(
LayoutInflater.from(parent.context)。
充气(右布局。项目\角色,父项,假)
)
}
覆盖onBindViewHolder(holder:MyViewHolder,位置:Int){
val项目:角色=列表!![位置]
holder.icon.setImageDrawable(Icons.getDrawable图标(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真的
}
}
重写getItemCount():Int{
返回列表!!.size
}
类MyViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
val图标:ImageView=itemView.findViewById(R.id.item_图标)
val text:TextView=itemView.findViewById(R.id.item_text)
}
/**
*使用新的侦听器覆盖适配器的侦听器。
*@param listener新建侦听器
*/
趣味setListener(监听器:OnItemClick){
this.listener=listener
}
/**
*将元素添加到适配器显示的列表中
*@param要插入的项目
*@param位置插入位置
*/
趣味附加项(项目:角色,职位:Int){
列表!!.add(项目)
已插入的项目(位置)
}
/**
*从适配器显示的列表中删除元素
*@param position要删除的项目的位置
*/
乐趣移除项(位置:Int){
列表!!.removeAt(位置)
已删除的项目(位置)
}
}
活动
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
}
override-fun-onCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u new\u游戏)
currentPlayersRV=findViewById(R.id.current\U players\U rv)
availableRolesRV=findViewById(R.id.roles\u rv)
CurrentPlayerAdapter=RoleAdapter(上下文=applicationContext,列表=ArrayList())
CurrentPlayerAdapter!!.setListener(插入\u LISTENER\u 1)
currentPlayersRV!!.layoutManager=GridLayoutManager(baseContext,3)
currentPlayersRV!!.adapter=currentPlayersAdapter
availableRolesAdapter=RoleAdapter(上下文=applicationContext,列表=Role.getRoles(applicationContext))
availableRolesAdapter!!.setListener(插入\u LISTENER\u 2)
availableRolesRV!!.layoutManager=GridLayoutManager(baseContext,3)
availableRolesRV!!.adapter=availableRolesAdapter
}
您已经描述了两种实现接口的方法,这两种方法都可以用Java或Kotlin实现
//Java
公共类MyActivity扩展AppCompatActivity实现RoleAdapter.Listener{
私人名单数据;
// ...
公共void onClick(内部位置){
doSomething(data.get(position));
}
公共布尔值保持(整数位置){
返回doSomethingElse(data.get(position));
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// ...
setListener(this);
adapter2.setListener(此);
}
}
//Kotlin
类MyActivity:AppCompatActivity(),RoleAdapter.Listener{
私有变量数据:列表?=null
// ...
趣味onClick(位置:Int){
数据?获取(位置)?。让{doSomething(it)}
}
乐趣保持(位置:Int):布尔值{
返回数据?获取(位置)?。让{doSomethingElse(it)}
}
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
// ...
adapter.listener=this
adapter2.listener=此
}
}
//Java
公共类MyActivity扩展了AppCompatActivity{
私人名单数据;
私有列表数据2;
private RoleAdapter.Listener adapterListener=new RoleAdapter.Listener(){
公共void onClick(内部位置){
doSomething(data.get(position));
}
公共布尔值保持(整数位置){
返回doSomethingElse(data.get(position));
}
};
private RoleAdapter.Listener adapterListener2=新RoleAdapter.Listener(){