android - 为什么我在创建 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
}
}
}
解决方案
问题在这里:
intent.putExtra("noti", book)
该book
变量是 type Book
,显然既不是 a 也不是Parcelable
class Serializable
。您必须在类中实现这两个接口之一Book
才能将其添加到Intent
or 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)
)。这将需要对适配器的单击侦听器参数进行相应的类型更改。
推荐阅读
- c# - 在c#中获取父级的子级和子级
- woocommerce - 根据交货日期显示的商店产品(woocommerce)
- python - 如何选择目录并将其存储到 tkinter 中的变量中?
- angular - 路由到也应该路由的组件
- html - 将图像放在 div 的中心
- html - 如何将特定文本隐藏在使用CSS的元素?
- laravel-5 - php artisan serve 不工作,错误“”在 ProviderRepository.php 第 208 行:找不到类 'Intervention\Image\ImageServiceProvider'“”
- sql - Oracle SQL:如何将列标题的第一个字符而不是值大写?
- javascript - 无法在未安装的组件上设置状态
- java - POST 请求来自邮递员,但不是来自 java 代码