【发布时间】:2022-01-17 14:41:52
【问题描述】:
我正在编写一个应用程序,可让您设置美发师预约。我将有关访问的数据存储在 firebase 数据库中。我正在尝试使用 onclick 侦听器实现一个 recyclerview,它在 recycler cardview 中显示日期并在单击后显示带有详细信息的新活动。我在将数据传递给此详细信息活动时遇到问题。单击回收器后应用程序崩溃,我得到的主要错误是
java.lang.RuntimeException: Parcelable遇到IOException写 可序列化对象
OrderForm.class
package com.example.barberqueue.db
import com.example.barberqueue.SummaryViewModel
import java.io.Serializable
import java.util.ArrayList
class OrderForm(
val date: String? = null,
val hour: String? = null,
val isAccepted: Boolean = false,
val isCanceled: Boolean = false,
val isDone: Boolean = false,
val price: Float = 0f,
val services: ArrayList<SummaryViewModel>? = null,
val servicesTime: Int = 0,
val userId: String? = null
): Serializable {}
AppointmentsAdapter.kt
package com.example.barberqueue.adapters
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.barberqueue.R
import com.example.barberqueue.db.OrderForm
import com.example.barberqueue.interfaces.OrderClickView
class AppointmentsAdapter(
private val appointmentsList: ArrayList<OrderForm>, private val orderClickView: OrderClickView
) :
RecyclerView.Adapter<AppointmentsAdapter.AppointmentsViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppointmentsViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(
R.layout.appointments_view_itemview,
parent, false
)
return AppointmentsViewHolder(itemView)
}
override fun onBindViewHolder(holder: AppointmentsViewHolder, position: Int) {
val currentItem = appointmentsList[position]
holder.date.text = currentItem.date
holder.itemView.setBackgroundColor(Color.parseColor("#00ffffff"))
holder.itemView.setOnClickListener {
orderClickView.onClickOrder(appointmentsList[position], holder.bindingAdapterPosition)
}
}
override fun getItemCount(): Int {
return appointmentsList.size
}
class AppointmentsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val date: TextView = itemView.findViewById(R.id.appointment_date)
}
}
Dashboard.kt(显示回收站的地方)
package com.example.barberqueue
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.MotionEvent
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.barberqueue.adapters.AppointmentsAdapter
import com.example.barberqueue.databinding.DashboardBinding
import com.example.barberqueue.db.OrderForm
import com.example.barberqueue.interfaces.OrderClickView
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.database.*
import com.google.firebase.ktx.Firebase
class Dashboard : AppCompatActivity(), OrderClickView {
private var x1: Float = 0F
private var y1: Float = 0F
private var x2: Float = 0F
private var y2: Float = 0F
private lateinit var database: DatabaseReference
private lateinit var orderArrayList: ArrayList<OrderForm>
private lateinit var auth: FirebaseAuth
private lateinit var binding: DashboardBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DashboardBinding.inflate(layoutInflater)
setContentView(binding.root)
database = FirebaseDatabase.getInstance().reference
auth = FirebaseAuth.getInstance()
findViewById<Button>(R.id.add_new_visit_btn)
binding.addNewVisitBtn.setOnClickListener { openActivityNewVisit() }
binding.accMngBtn.setOnClickListener { openActivityAccountManagement() }
binding.logoutBtn.setOnClickListener {
Firebase.auth.signOut()
finish()
openActivityMainActivity()
}
binding.logo.setOnClickListener {
openActivityContact()
}
binding.appointmentsView.layoutManager = LinearLayoutManager(this)
binding.appointmentsView.setHasFixedSize(true)
orderArrayList = arrayListOf<OrderForm>()
getData()
}
override fun onClickOrder(order: OrderForm, position: Int) {
val intent= Intent(this, ViewAppointment::class.java)
intent.putExtra("order", order)
startActivity(intent)
}
private fun getData() {
database = FirebaseDatabase.getInstance().getReference("FutureAppointment")
database.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
//Log.w("TAG", "app_added1")
for (appointmentSnapshot in snapshot.children) {
val appointment = appointmentSnapshot.getValue(OrderForm::class.java)
if (appointment != null) {
if (appointment.userId == auth.currentUser?.uid /*oraz data jest w przyszłości lub dzisiejsza*/) {
orderArrayList.add(appointment)
//Log.w("TAG", "app_added")
}
}
}
binding.appointmentsView.adapter = AppointmentsAdapter(orderArrayList, this@Dashboard)
}
}
override fun onCancelled(error: DatabaseError) {
Log.w("TAG", "loadPost:onCancelled")
}
})
}
private fun openActivityMainActivity() {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
}
private fun openActivityContact() {
val intent = Intent(this, ContactData::class.java)
startActivity(intent)
}
private fun changingTabs(position: Int) {
if (position == 0) {
}
if (position == 1) {
}
}
//funkcja do poruszania sie po ui w poziomie
override fun onTouchEvent(touchEvent: MotionEvent): Boolean {
when (touchEvent.action) {
MotionEvent.ACTION_DOWN -> {
x1 = touchEvent.x
y1 = touchEvent.y
}
MotionEvent.ACTION_UP -> {
x2 = touchEvent.x
y2 = touchEvent.y
if (x1 < x2 && y1 <= y2 + 100 && y1 >= y2 - 100) {
openActivityMenu()
Log.e("position", "$x1,$y1 $x2,$y2")
} else if (x1 > x2 && y1 <= y2 + 100 && y1 >= y2 - 100) {
openActivitySTH()
Log.e("position", "$x1,$y1 $x2,$y2")
}
}
}
return false
}
private fun openActivityAccountManagement() {
val intent = Intent(this, AccountManagement::class.java)
startActivity(intent)
}
private fun openActivityMenu() {
val intent = Intent(this, Menu::class.java)
startActivity(intent)
}
private fun openActivitySTH() {
val intent = Intent(this, Right::class.java)
startActivity(intent)
}
private fun openActivityNewVisit() {
val intent = Intent(this, NewVisit::class.java)
startActivity(intent)
}
}
Interfaces.kt
package com.example.barberqueue.interfaces
import com.example.barberqueue.db.OrderForm
import com.google.firebase.firestore.auth.User
interface FromMakeAppointmentToSummary {
fun getSelectedTime(time: String)
}
interface OrderClickView{
fun onClickOrder(orderForm : OrderForm, position: Int)
}
【问题讨论】:
标签: android kotlin android-recyclerview