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