# #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. Возможно, есть более простой способ передачи этих данных, я сейчас в замешательстве… 🙁