【发布时间】:2019-11-10 11:12:38
【问题描述】:
我正在创建一个联系人应用程序,在该应用程序中使用 Recycler View 列出项目。回收站视图工作正常,并列出了如下图所示的项目
现在我希望每个联系人点击将其详细信息转移到另一个布局(配置文件布局),如下所示
recycler 适配器可以在点击时工作,甚至只是制作一个 Toast,但不能让 Dialog 将数据传输到另一个布局。我尝试了几次,但都失败了。
这是我的适配器
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)
}
}
}
我想使用Dialog方法,因为我觉得它更容易但我无法添加窗口错误,我尝试引入一个Activity但证明很困难。请帮忙。我将其用作我的学习项目。
【问题讨论】:
-
不要将
applicationContext用于任何与 UI 相关的内容;例如,您的ContactAdapter。请改用Activity;即this. -
感谢 Mike,对话框现在可以工作,但 WindowsManager.LayoutParams.TYPE_APPLICATION_PANEL 会使应用程序崩溃。如果没有它,我怎样才能使对话框成为全屏
标签: android kotlin android-listview android-recyclerview