here is my activity code:-
class event_images : AppCompatActivity() {
private var recyclerView: RecyclerView? = null
private var imageAdapter: Imageadapter? = null
private var img1: MutableList<IMG>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_event_images)
recyclerView = event_images
recyclerView?.setHasFixedSize(true)
recyclerView?.layoutManager = LinearLayoutManager(baseContext)
img1 = ArrayList()
imageAdapter = baseContext?.let { Imageadapter(it, img1 as ArrayList<IMG>, true) }
recyclerView?.adapter = imageAdapter
val wimagesRef = FirebaseDatabase.getInstance().getReference().child("events")
e_imagesRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (snapshot in dataSnapshot.children){
val image = snapshot.getValue(IMG::class.java)
if (image != null){
event_images.visibility = View.VISIBLE
(img1 as ArrayList<IMG>)?.add(image)
}
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
}
here is adapter code:-
class Imageadapter (private var mContext: Context,
private var mimages: List<IMG>,
private var isActivity: Boolean = false) : RecyclerView.Adapter<Imageadapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Imageadapter.ViewHolder {
val view = LayoutInflater.from(mContext).inflate(R.layout.images_adapter, parent, false)
return Imageadapter.ViewHolder(view)
}
override fun onBindViewHolder(holder: Imageadapter.ViewHolder, position: Int) {
val imageid = mimages[position]
Picasso.get().load(imageid.getImageUrl()).into(holder.ImageIv)
holder.Datetv.text = imageid.getDate()
holder.Venuetv.text = imageid.getVenue()
}
override fun getItemCount(): Int {
return mimages.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var ImageIv: ImageView = itemView.image_ret
var Datetv: TextView = itemView.date_ret
var Venuetv: TextView = itemView.venue_ret
}
here is my model code:-
class IMG {
private var ImageUrl: ImageView = ""
private var date: String = ""
private var venue: String = ""
constructor()
constructor(ImageUrl: ImageView,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}
fun getDate(): String
{
return date
}
fun setDate(Date: String){
this.date = Date
}
fun getImageUrl(): String {
return ImageUrl
}
fun setImageUrl(ImageUrl: String){
this.ImageUrl = ImageUrl
}
fun getVenue(): String
{
return venue
}
fun setVenue(Venue: String){
this.venue = Venue
}
}
The error my project is:-
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.events.Model.IMG at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203) at com.example.events.event_images$onCreate$2.onDataChange(event_images.kt:38) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
the snapshot of the db is:- database snapshot
I don't know how solve this error. Can someone help me solving this problem?
CodePudding user response:
This means that the database encountered a single string property, where your code said it should expect an entire IMG object in your snapshot.getValue(IMG::class.java) call.
It's impossible for us to say for sure why this is, but check the events node in your database, because at least one child node/property under it is a string value, instead of an IMG object.
CodePudding user response:
You might need to change, If issue isn't resolved. Then please share your DB snapshot.
class IMG {
private var ImageUrl: ImageView = ""
AND
constructor(ImageUrl: ImageView,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}
to
class IMG {
private var ImageUrl: String = ""
AND
constructor(ImageUrl: String,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}
