Как управлять событием клика в recyclerView - PullRequest
0 голосов
/ 10 ноября 2019

Я создаю контактное приложение, в котором использую Recycler View для вывода списка. Представление рециркулятора работает нормально и перечисляет элементы, как показано на рисунке ниже

The contactlist page

Теперь я хочу, чтобы каждый контакт щелкал, чтобы передать его данныедругой макет (макет профиля), который будет выглядеть следующим образом:

enter image description here

Адаптер утилизатора работает по нажатию даже для того, чтобы просто сделать тост, но не работает для передачи диалогаданные в другой макет. Я попробовал несколько попыток, но оказался бесполезным.

Вот мой адаптер

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)
        }
    }
}

Я хочу использовать метод диалога, потому что я чувствую, что этопроще, но я не смог добавить ошибку окна, я попытался ввести активность, но оказалось трудным. Пожалуйста, помогите. Я использую это как проект для моего обучения.

1 Ответ

0 голосов
/ 10 ноября 2019

Лучший способ использования Интерфейс для связи между Адаптером и Деятельностью.

При обратном вызове интерфейса активности показывается Диалог, использующий Контекст Деятельности, поскольку метод реализован в действии, поэтому контекст доступен в классе Деятельности.

...