首页 > 解决方案 > 为什么我在创建 Intent 时会出现此错误,并且必须从第二个屏幕上 RecyclerView 中的 Firebase 传递数据

问题描述

我标记了在应用程序运行后添加(添加到代码中)的部分,数据已从数据库中成功下载。我可能错误地试图将此信息传递到另一个屏幕。我试图找到一个连接到数据库的视频并在另一个屏幕上转发recicle的数据,但没有成功,或者它们是Java,我不太了解。

我的第二个活动

 class BookDescription : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_book_description)
 
        var books = intent.getSerializableExtra("noti") as Book //added to code
 
         Glide.with(this).load(books.imageUrl).into(bookImg2)// added to code
         nameTxt2.text = books.name //added to code
         autorTxt2.text = books.writer  //added to code
     } 
}

主要活动

class MainActivity : AppCompatActivity() {
    
    private lateinit var adapter : Adapter
    private val viewModel by lazy { ViewModelProviders.of(this).get(MainViewModel::class.java)}
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setUpRecyclerView()
    }

    private fun setUpRecyclerView(){
        adapter = Adapter(this){
            startBookDescription()
        }
        recycle.layoutManager = GridLayoutManager(this, 2)
        recycle.adapter = adapter
        observerData()
    }

       fun observerData(){
           viewModel.fetchUserData().observe(this,Observer{
               adapter.setListdata(it)
               adapter.notifyDataSetChanged()
           })
       }

    private fun startBookDescription(){
        val intent = Intent (this, BookDescription::class.java )
        startActivity(intent)
    }
}

带有内部类 Holder 的类适配器

class Adapter(private val context: Context,
              private val onItemCliked: () -> Unit ) : RecyclerView.Adapter<Adapter.Holder>() {

    private var datalist = mutableListOf<Book>()
    fun setListdata(data: MutableList<Book>){
        datalist = data
    }

    inner class Holder(itemView : View) : RecyclerView.ViewHolder(itemView){
         fun bindView(book: Book, onItemClicked: () -> Unit){
             Glide.with(context).load(book.imageUrl).into(itemView.bookImg)
             itemView.nameTxt.text = book.name
             itemView.autorTxt.text= book.writer
             itemView.setOnClickListener { onItemClicked.invoke() }

            itemView.bookImg.setOnClickListener(View.OnClickListener { //added
            val intent = Intent(context, BookDescription::class.java)//added to code
                 intent.putExtra("noti", book)//added to code
                 context.startActivity(intent)//added to code
             })
         }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val view = LayoutInflater.from(context).inflate(R.layout.book_format, parent,
false )
        return Holder(view)
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
           val book = datalist[position]
           holder.bindView(book, onItemCliked)
    }

    override fun getItemCount(): Int {
       return if (datalist.size> 0){
            datalist.size
        }else{
            0
        }
    } 
}

错误信息

标签: androidfirebasekotlinandroid-recyclerview

解决方案


问题在这里:

intent.putExtra("noti", book)

book变量是 type Book,显然既不是 a 也不是Parcelableclass Serializable。您必须在类中实现这两个接口之一Book才能将其添加到Intentor Bundle

假设Book是由简单的数据类型(String,Int等)组成,那么您可以使用@Parcelize注解轻松实现Parcelable。更多信息:https ://developer.android.com/kotlin/parcelize


在您的bindView()方法中,您有以下代码块:

val intent = Intent(context, BookDescription::class.java)//added to code
    intent.putExtra("noti", book)//added to code
    context.startActivity(intent)//added to code
})

但是,您实际上并没有对此做任何事情Intent;你从另一个地方开始你的活动:

private fun startBookDescription(){
    val intent = Intent (this, BookDescription::class.java )
    startActivity(intent)
}

您必须将Book实例传递给此方法(通过invoke(book))。这将需要对适配器的单击侦听器参数进行相应的类型更改。


推荐阅读