kotlin 如何将View.OnClickListener与FirestoreRecyclerAdapter一起使用

xriantvc  于 2022-11-30  发布在  Kotlin
关注(0)|答案(1)|浏览(119)

我正在尝试创建一个应用程序,考虑到我的水平,这并不容易!我希望你能帮助我,因为我没有成功的许多链接,我发现在互联网上。
我无法添加View.OnClickListener的onClick函数,每次Intent函数都无法识别。我尝试在UserViewHolder和FirestoreRecyclerAdapter类中实现它,但它不起作用。
下面是我目前的代码:
------Kotlin部分-----

package edu.stanford.rkpandey.emojistatus

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.*
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.firebase.ui.firestore.FirestoreRecyclerAdapter
import com.firebase.ui.firestore.FirestoreRecyclerOptions
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.ktx.Firebase
import kotlinx.android.synthetic.main.activity_main.*

data class User(
    val displayName: String? = "",
    val emojis: String? = ""
)

class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

class MainActivity : AppCompatActivity() {

    private val db = Firebase.firestore
    private lateinit var auth: FirebaseAuth

    // Query the users collection
    private val query = db.collection("users")
    val options = FirestoreRecyclerOptions.Builder<User>()
        .setQuery(query, User::class.java)
        .setLifecycleOwner(this).build()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        auth = Firebase.auth

        val adapter = object: FirestoreRecyclerAdapter<User, UserViewHolder>(options) {

            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
                val view = LayoutInflater.from(this@MainActivity).inflate(R.layout.item_pack, parent, false)
                return UserViewHolder(view)
            }

            override fun onBindViewHolder(
                holder: UserViewHolder,
                position: Int,
                model: User
            ) {
                val tvName: TextView = holder.itemView.findViewById(R.id.title)
                val tvEmojis: TextView = holder.itemView.findViewById(R.id.excerpt)
                tvName.text = model.displayName
                tvEmojis.text = model.emojis
            }

        }
        rvUsers.adapter = adapter
        rvUsers.layoutManager = LinearLayoutManager(this)
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        if (item.itemId == R.id.miLogout) {
            Log.i("MainActivity", "Logout")
            auth.signOut()
            val logoutIntent = Intent(this, LoginActivity::class.java)
            logoutIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            startActivity(logoutIntent)
        }
        return super.onOptionsItemSelected(item)
    }

}

------ xml部分-------
=〉活动_主要

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rvUsers"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

=〉物品_ Package

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="100sp"
    xmlns:app="http://schemas.android.com/apk/res-auto">

<androidx.cardview.widget.CardView
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginStart="12sp"
    android:layout_marginTop="12sp"
    android:layout_marginEnd="12sp"
    android:focusable="true"
    android:clickable="true"
    app:cardCornerRadius="10dp"
    android:foreground="?android:attr/selectableItemBackground">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp"
        android:background="@color/colorPack">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5sp"
            style="@style/NoteTitleFont"
            android:textColor="@color/colorTitle"
            tools:text="Note 1" />

        <TextView
            android:id="@+id/excerpt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="12sp"
            android:layout_below="@id/title"
            android:maxLines="1"
            android:ellipsize="end"
            android:textStyle="italic"
            android:textColor="@color/colorDescribe"
            tools:text="test text va se trouver ici, ça va contenir le début de la description du package." />

    </RelativeLayout>

</androidx.cardview.widget.CardView>

</RelativeLayout>

此代码给出以下结果:

我希望当我点击其中一个carview时,它可以进入activity_pack_detail。你知道如何对PackDetailActivity做意图吗?
无论我做什么,我都会收到此错误=〉

e0bqpujr

e0bqpujr1#

出现该错误是因为调用Intent的类构造函数时使用了错误的参数。第一个参数应该是Context而不是View。关键字this在代码中引用了View而不是上下文,因此出现了该错误。
要解决这个问题,必须传递一个Context对象,如下所示:

val i = Intent(view.getContext(), PackDetailActivity::class.java)

你的错误就会消失。

相关问题