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 如何在recyclerView中管理单击事件_Android_Kotlin_Android Listview_Android Recyclerview - Fatal编程技术网

Android 如何在recyclerView中管理单击事件

Android 如何在recyclerView中管理单击事件,android,kotlin,android-listview,android-recyclerview,Android,Kotlin,Android Listview,Android Recyclerview,我正在创建一个联系人应用程序,其中使用Recycler视图列出项目。“回收者”视图工作正常,并列出项目,如下图所示 现在,我希望每个联系人单击以将其详细信息传输到另一个布局(配置文件布局),如下所示 recycler适配器可以在单击时工作,甚至可以只做一个祝酒词,但在对话框中将数据传输到另一个布局时不起作用。我试过几次,但都没有成功 这是我的适配器 package com.example.newcontactapp 导入android.app.Dialog 导入android.content

我正在创建一个联系人应用程序,其中使用Recycler视图列出项目。“回收者”视图工作正常,并列出项目,如下图所示

现在,我希望每个联系人单击以将其详细信息传输到另一个布局(配置文件布局),如下所示

recycler适配器可以在单击时工作,甚至可以只做一个祝酒词,但在对话框中将数据传输到另一个布局时不起作用。我试过几次,但都没有成功

这是我的适配器
package com.example.newcontactapp
导入android.app.Dialog
导入android.content.Context
导入android.view.LayoutInflater
导入android.view.view
导入android.view.ViewGroup
导入android.view.WindowManager
导入android.widget.ImageView
导入android.widget.TextView
导入android.widget.Toast
导入androidx.recyclerview.widget.recyclerview
类ContactAdapter(数据:ArrayList,内部变量上下文:context):RecyclerView.Adapter(){
内部变量数据:ArrayList
初始化{
this.data=数据
}
覆盖CreateViewHolder(父级:ViewGroup,viewType:Int):ContactViewHolder{
val layout=LayoutInflater.from(上下文)。充气(R.layout.contact_行,父级,false)
返回ContactViewHolder(布局)
}
覆盖BindViewHolder(支架:ContactViewHolder,位置:Int){
holder.name.text=数据[位置].name
holder.phoneNumber.text=数据[位置].电话
holder.image.setImageResource(数据[位置].image)
holder.card.setOnClickListener{
Toast.makeText(上下文,数据[position].name,Toast.LENGTH\u SHORT.show())
//val profilePage=对话框(this.context)
//profilePage.setContentView(R.layout.profile)
////profilePage.window?.setType(WindowManager.LayoutParams.TYPE\u应用程序\u面板)
//profilePage.setTitle(“配置文件页”)
//
//val profileName=profilePage.findViewById(R.id.profileName)
//val profileEmail=profilePage.findviewbyd(R.id.profileEmail)
//val profileImage=profilePage.findviewbyd(R.id.profileImage)
//
//profileName.text=数据[位置].name
//profileEmail.text=数据[位置].电话
//profileImage.setImageResource(数据[位置].image)
//
//profilePage.show()
}
}
重写getItemCount():Int{
返回数据大小
}
类ContactViewHolder(contactView:View):RecyclerView.ViewHolder(contactView){
内部变量名称:TextView
内部var图像:ImageView
内部var电话号码:TextView
内部var卡:视图组;
初始化{
name=itemView.findviewbyd(R.id.itemText)
image=itemView.findViewById(R.id.itemImage)
phoneNumber=itemView.findViewById(R.id.itemPhone)
card=itemView.findViewById(R.id.contactCard)
}
}
}
主要活动
package com.example.newcontactapp
导入android.os.Bundle
导入com.google.android.material.snackbar.snackbar
导入androidx.appcompat.app.appcompat活动
导入android.view.Menu
导入android.view.MenuItem
导入androidx.recyclerview.widget.LinearLayoutManager
导入kotlinx.android.synthetic.main.activity\u main*
类MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//设置支持操作栏(工具栏)
val contacts=ArrayList()
contacts.add(ContactClass(“Darot”,R.drawable.maleavatar,“08000000000”))
contacts.add(ContactClass(“Lewis”,R.drawable.maleavatar,“08000000000”))
contacts.add(ContactClass(“Chigozie”,R.drawable.femaleavatar,“08000000000”))
contacts.add(ContactClass(“Chigozie”,R.drawable.femaleavatar,“08000000000”))
contacts.add(ContactClass(“Chigozie”,R.drawable.femaleavatar,“08000000000”))
contacts.add(ContactClass(“Chigozie”,R.drawable.femaleavatar,“08000000000”))
contacts.add(ContactClass(“Chigozie”,R.drawable.femaleavatar,“08000000000”))
contacts.add(ContactClass(“Chigozie”,R.drawable.femaleavatar,“08000000000”))
val适配器=ContactAdapter(联系人,applicationContext)
recycler.layoutManager=LinearLayoutManager(applicationContext)
recycler.adapter=适配器
fab.setOnClickListener{view->
Snackbar.make(查看“替换为您自己的操作”,Snackbar.LENGTH\u LONG)
.setAction(“Action”,null).show()
}
}
重写创建选项菜单(菜单:菜单):布尔值{
//为菜单充气;这会将项目添加到操作栏(如果存在)。
菜单充气器(右菜单菜单主菜单)
返回真值
}
覆盖选项ItemSelected(项:菜单项):布尔值{
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
返回时间(item.itemId){
R.id.action\u设置->真
else->super.onOptionsItemSelected(项目)
}
}
}

我想使用对话框方法,因为我觉得它更容易,但我无法添加窗口错误,我尝试引入一个活动,但证明很难。请帮忙。我将此作为一个学习项目。

适配器和活动之间通信的最佳使用界面


在activity interface callback中,使用activity Context显示对话框,因为方法在activity中实现,所以上下文在activity类中可用。

不要对任何与UI相关的内容使用
applicationContext
;e、 例如,您的
联系人适配器
。使用
活动
;i、 例如,
。谢谢Mike,该对话框现在可以工作,但WindowsManager.LayoutParam
package com.example.newcontactapp

import android.app.Dialog
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView

class ContactAdapter (data:ArrayList<ContactClass>, internal var context: Context):RecyclerView.Adapter<ContactAdapter.ContactViewHolder>(){

    internal var data : ArrayList<ContactClass>

    init{
        this.data = data
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContactViewHolder{
        val layout = LayoutInflater.from(context).inflate(R.layout.contact_row, parent, false)
        return ContactViewHolder(layout)
    }

    override fun onBindViewHolder(holder:ContactViewHolder, position:Int){

        holder.name.text = data[position].name
        holder.phoneNumber.text = data[position].phone
        holder.image.setImageResource(data[position].image)

        holder.card.setOnClickListener {

            Toast.makeText(context, data[position].name, Toast.LENGTH_SHORT).show()

//            val profilePage = Dialog(this.context)
//            profilePage.setContentView(R.layout.profile)
////            profilePage.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_PANEL)
//            profilePage.setTitle("Profile page")
//
//            val profileName = profilePage.findViewById<TextView>(R.id.profileName)
//            val profileEmail = profilePage.findViewById<TextView>(R.id.profileEmail)
//            val profileImage = profilePage.findViewById<ImageView>(R.id.profileImage)
//
//            profileName.text = data[position].name
//            profileEmail.text = data[position].phone
//            profileImage.setImageResource(data[position].image)
//
//            profilePage.show()

        }


    }

    override fun getItemCount(): Int {
        return data.size
    }

    class ContactViewHolder(contactView: View): RecyclerView.ViewHolder(contactView){
        internal var name: TextView
        internal var image: ImageView
        internal var phoneNumber: TextView
        internal var card: ViewGroup;

        init{
            name = itemView.findViewById(R.id.itemText)
            image = itemView.findViewById(R.id.itemImage)
            phoneNumber = itemView.findViewById(R.id.itemPhone)
            card = itemView.findViewById(R.id.contactCard)

        }
    }
}
package com.example.newcontactapp

import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import androidx.recyclerview.widget.LinearLayoutManager

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
//        setSupportActionBar(toolbar)

        val contacts = ArrayList<ContactClass>()

        contacts.add(ContactClass("Darot", R.drawable.maleavatar, "080000000000"))
        contacts.add(ContactClass("Lewis", R.drawable.maleavatar, "080000000000"))
        contacts.add(ContactClass("Chigozie", R.drawable.femaleavatar, "080000000000"))
        contacts.add(ContactClass("Chigozie", R.drawable.femaleavatar, "080000000000"))
        contacts.add(ContactClass("Chigozie", R.drawable.femaleavatar, "080000000000"))
        contacts.add(ContactClass("Chigozie", R.drawable.femaleavatar, "080000000000"))
        contacts.add(ContactClass("Chigozie", R.drawable.femaleavatar, "080000000000"))
        contacts.add(ContactClass("Chigozie", R.drawable.femaleavatar, "080000000000"))

        val adapter = ContactAdapter(contacts, applicationContext)
        recycler.layoutManager = LinearLayoutManager(applicationContext)
        recycler.adapter = adapter

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        return when (item.itemId) {
            R.id.action_settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
}