Почему я получаю эту ошибку при создании намерения и необходимости передачи данных из Firebase, которые находятся в RecyclerView на втором экране

# #android #firebase #kotlin #android-recyclerview

Вопрос:

Я отметил части, которые были добавлены (добавлены в код) после того, как приложение работало, данные были успешно загружены из базы данных. Возможно, я ошибочно пытаюсь передать эту информацию на другой экран. Я попытался найти видео, которое подключается к базе данных и пересылает эти данные recicler на другой экран, но безуспешно, или они на 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)
    }
}
 

Адаптер класса с внутренним держателем класса

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

Сообщение об ошибке

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос (прямо под ним есть ссылка), чтобы включить точное сообщение об ошибке и трассировку стека, которые вы получите.

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

3. Эта ошибка показана по уважительной причине, так как ваш вопрос действительно довольно легок в деталях. Отображение сообщения об ошибке в виде текста помогает в этом, но затем помечайте его не как код, а как блок ( > в начале каждой строки).

4. Успешно добавлена остальная часть кода, благодаря вам вы спасаете реальную жизнь. Я действительно ценю ваши усилия, я несколько дней искал в Интернете, чтобы решить эту проблему. @FrankvanPuffelen

Ответ №1:

Проблема в том, что здесь:

 intent.putExtra("noti", book)
 

book Переменная имеет тип Book , который, по-видимому, не является ни a Parcelable , ни Serializable классом. Вы должны реализовать один из этих двух интерфейсов в Book классе, чтобы добавить его в Intent операционную 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) ). Для этого потребуется соответствующее изменение типа параметра прослушивателя щелчков вашего адаптера.

Комментарии:

1. Ошибка исчезла благодаря вашей помощи, но данные по-прежнему не передаются на другой экран. Вы знаете, в чем проблема с моим кодом? Приложение подключено к Firebase.

2. Я груб, если попрошу немного больше разъяснений, я студент и новичок в этом. Пожалуйста, @Бен П.

3. Возможно, есть более простой способ передачи этих данных, я сейчас в замешательстве… 🙁