【问题标题】:How to manage click event in recyclerView如何在recyclerView中管理点击事件
【发布时间】: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


【解决方案1】:

Adapter 和 Activity 之间使用接口进行通信的最佳方式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多