Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在同一活动中使用接口两次_Android_Kotlin_Android Recyclerview_Interface - Fatal编程技术网

Android 在同一活动中使用接口两次

Android 在同一活动中使用接口两次,android,kotlin,android-recyclerview,interface,Android,Kotlin,Android Recyclerview,Interface,只是想让你知道,我对Kotlin很陌生,但我对Java有很好的经验。 我在一个活动中有两个recycler视图,它们具有相同的适配器,但行为不同。在Java中,只需在适配器类中创建一个接口,并使用方法setOnItemClick(OnClick-OnClick)覆盖它,但在Kotlin中,情况似乎有所不同。 我看到人们在活动中重写了接口,这将仅作为一种行为。。。 有什么建议吗 更新:见下面的代码: 适配器类: class RoleAdapter(context : Context, list :

只是想让你知道,我对Kotlin很陌生,但我对Java有很好的经验。 我在一个活动中有两个recycler视图,它们具有相同的适配器,但行为不同。在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)
    }
}
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(){