如何在recyclerView中管理点击事件

时间:2019-11-10 11:12:38

标签: android kotlin android-recyclerview android-listview recycler-adapter

我正在创建一个联系人应用程序,该应用程序正在使用“回收者视图”列出这些项目。回收者视图工作正常,并列出了如下图所示的物品

The contactlist page

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

enter image description here

回收站适配器在onclick上也可以工作,即使只是做一个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)

        }
    }
}

MainActivity

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,但是事实证明很困难。请帮助。我将其用作学习项目。

1 个答案:

答案 0 :(得分:0)

适配器和活动之间进行通讯的最佳方式使用接口。

在活动接口回调中显示使用“活动上下文”的对话框,因为在活动中实现了方法,因此在“活动”类中可以使用上下文。

相关问题