i got this error and cant resolve it: Expected a List while deserializing, but got a class java.lang.String; - firebase

i kown that is sunday but i got this problem, and i dont have any idea about how i fix it.
ps: the other questions in stackoverflow are in java, im using kotlin, and are about map error, not list.
my class User
#Parcelize
class User (val primeiroLogin:Boolean, val tutorialComplete:Boolean, val
username:String, val uid:String, val viewed:ArrayList<String>) : Parcelable {
constructor() : this(true,false,"","", ArrayList())
}
most part of the activity where i got the error
var viewed = ArrayList<String>()
private fun selectCategories(){
val ref = FirebaseDatabase.getInstance().getReference("/users")
ref.addListenerForSingleValueEvent(object: ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
var cUid = ""
val user = FirebaseAuth.getInstance().currentUser
user?.let {
val uid = user.uid
cUid = uid
}
p0.children.forEach{
val user = it.getValue(User::class.java)
if(user?.uid == cUid){
viewed = user.viewed
}
}
}
})
}
private fun fetchCategories(){
val ref = FirebaseDatabase.getInstance().getReference("/categories")
ref.addListenerForSingleValueEvent(object: ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
val adapter = GroupAdapter<ViewHolder>()
p0.children.forEach{
val category = it.getValue(Category::class.java)
if(category != null){
for (i in 0..viewed.size) {
if(category.real_name != viewed[i]){
adapter.add(categories(category))
}
}
}
}
adapter.setOnItemClickListener { item, view ->
val categories = item as categories
val intent = Intent(view.context, LearningFirstLibras::class.java)
intent.putExtra(CATEGORY_KEY, categories.category)
startActivity(intent)
}
new_words_categories.adapter = adapter
}
})
.....
thank you guys!

Related

Can we create an ArrayList of parent nodes in firebase

I am a newbie in android development. I have searched google for answer to my problem but I could not find any that is why I am posting here.
Here is my db:
I want to retrieve list/Array list of all the "keys" and nested objects(0,1,2). Something like this {key1{object1,object2,..}key2{object1,object2,..}}. I can also use custom title/text instead of random keys.
private val _getquestlist = MutableLiveData<List<userquestlist>>()
val getquestlist: LiveData<List<userquestlist>>
get() = _getquestlist
fun fetchusertest(uname:String,sub:String,mon:String){
FirebaseDatabase.getInstance().getReference("UsersTest").child(sub).child(mon)
.addListenerForSingleValueEvent(object :ValueEventListener{
override fun onCancelled(error: DatabaseError) {
}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
var questionlist = mutableListOf<Question>()
for (keysnapshot in snapshot.children) {
val keystring: String? = keysnapshot.key
FirebaseDatabase.getInstance().getReference("UsersTest").child(sub).child(mon).child(keystring!!)
.addListenerForSingleValueEvent(object :ValueEventListener{
override fun onCancelled(error: DatabaseError) {
}
override fun onDataChange(snapshot: DataSnapshot) {
for (questSnapshot in snapshot.children) {
val question = questSnapshot.getValue(Question::class.java)
question?.let { questionlist.add(it) }
}
_getquestlist.value = questionlist
}
})
}
}
else _getquestlist.value=null
}
})
}
and this is Question class
data class Question(
var question:String?=null,
var opa:String?=null,
var opb:String?=null,
var opc:String?=null,
var time:Long?=null
)

Kotlin searchView does not reload Firebase array

I have one activity with 2 recyclerViews, both recyclers are used with Firebase. One of the recyclers displays the results of a query, the other recycler has a listener that updates every time there is an update in Firebase. I added a searchView to filter the results from Firebase. The issue I'm having is when I'm trying to search the results from the Firebase query, when I start typing I see results but when I click the X to stop searching, the adapter does not reload the array and i don't see the list of items unless I reload the activity. I'm not sure what I'm missing here. Any help/suggestion is greatly appreciated. Here is my code:
Adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Filter
import android.widget.Filterable
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.eduardoz.ezmdapp.Model.Charges
import com.eduardoz.ezmdapp.R
class ChargesAdapter (private var charges: ArrayList<Charges>
, private var chargesAll: ArrayList<Charges>
, private val itemClick: (Charges) -> Unit)
: RecyclerView.Adapter<ChargesAdapter.ViewHolder>()
, Filterable {
inner class ViewHolder(itemView: View, val itemClick: (Charges) -> Unit) :
RecyclerView.ViewHolder(itemView) {
private val chargeCode = itemView.findViewById<TextView>(R.id.chargeCodeTxt)
private val chargeDescription = itemView.findViewById<TextView>(R.id.chargeDescriptionTxt)
fun bindCharges(charges: Charges) {
chargeCode?.text = charges.chargeCode
chargeDescription?.text = charges.chargeDescription
itemView.setOnClickListener { itemClick(charges) }
}
}
init {
this.charges = charges
chargesAll = java.util.ArrayList(charges)
}
override fun getItemCount(): Int {
return charges.count()
}
override fun onBindViewHolder(holder: ChargesAdapter.ViewHolder, position: Int) {
holder.bindCharges(charges[position])
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChargesAdapter.ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.charges_list, parent, false)
return ViewHolder(view, itemClick)
}
override fun getFilter(): Filter {
return searchFilter
}
private val searchFilter: Filter = object: Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults {
val filteredList: ArrayList<Charges> = ArrayList()
if (constraint!!.isEmpty()) {
filteredList.addAll(chargesAll)
} else {
for(item in chargesAll) {
if
(item.chargeDescription.toLowerCase().contains(constraint.toString().toLowerCase())) {
filteredList.add(item)
}
}
}
val searchResults = FilterResults()
searchResults.values = filteredList
return searchResults
}
override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
charges.clear()
charges.addAll(results!!.values as Collection<Charges>)
notifyDataSetChanged()
}
}
}
Activity
descriptionSearch.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
return false
}
override fun onQueryTextChange(newText: String): Boolean {
if (newText.isNotEmpty()) {
searchViewBar(newText)
} else {
if (newText.isEmpty()) { //I ADDED THIS TO RELOAD THE ADAPTER
charges.clear()
chargeList()
}
}
return false
}
})
private fun searchViewBar(newText: String) {
chargesListener = chargesCollectionRef
.whereGreaterThanOrEqualTo(CHARGE_DESCRIPTION, newText)
.whereLessThanOrEqualTo(CHARGE_DESCRIPTION, newText+"z")
.addSnapshotListener(this) { snapshot, exception ->
if (exception != null) {
println("error")
}
if (snapshot != null) {
charges.clear()
parseData(snapshot)
}
}
}
fun parseData(snapshot: QuerySnapshot) {
for (document in snapshot.documents) {
val data = document.data
val chargeCode = data!![CHARGE_CODE] as String
val chargeDescription = data[CHARGE_DESCRIPTION] as String
val chargeSpecialty = data[CHARGE_SPECIALTY] as String
val newChargeList = Charges(chargeCode, chargeDescription, chargeSpecialty)
charges.add(newChargeList)
}
chargesFromAdapter.notifyDataSetChanged()
}

How to query different references in firebase and check if one of the child is equal to the other childs value

I am not sure if the question seems perfect but I wIll appreciate any help
here is my firebase database
I have 2 different references.one is the user and the other is the item..its a buying and selling app..I want to set the users image to his item on the show item activity...
how do i go about the query..
if boyo#yahoo.com post an item,I want the other users to see his image and his full names under the showitemactivity
here is a screen showof my show activity item
thanks in anticipation
here is the code I am using
private fun getItemDetails(itemId: String?) {
val firebaseDatabase: FirebaseDatabase = FirebaseDatabase.getInstance()
var rootRef: DatabaseReference = firebaseDatabase.reference
rootRef.child("Items").child(itemId!!).addValueEventListener(object : ValueEventListener{
override fun onDataChange(p0: DataSnapshot) {
if (p0.exists()) {
val sellerid: String = p0.child("uid").value.toString()
(imagesArray as ArrayList<Items>).clear()
for (snapshot in p0.children) {
val items = p0.getValue(Items::class.java)
/* var decimalFormat: DecimalFormat = DecimalFormat("#,##0.00")
var formattedValue: String = decimalFormat.format(items!!.getpricee())*/
(imagesArray as ArrayList<Items>).add(items!!)
priceTV!!.text = items.getpricee()
titleTV!!.text = items.gettitlee()
descriptionTV!!.text = items.getdescriptionn()
categoryTV!!.text = items.getcategoryy()
subcategoryTV!!.text = items.getsubcategoryy()
state!!.text = items.getstatee()
lga!!.text = items.getlgaa()
date!!.text = items.getdatee()
time!!.text = items.gettimee()
rootRef.child("Users").addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
if(p0.exists()) {
for(snapshot in p0
.children) {
val users = snapshot.getValue(Users::class.java)
if(snapshot.equals(sellerid)) {
username!!.text = users!!.getFullnamee()
if(users.getImageee().isEmpty()) {
userImage!!.setImageResource(R.drawable.avatarplaceholder)
} else {
Picasso.get().load(users.getImageee())
.into(userImage)
}
}
}
}
}
})
}
}
sliderPageAdapter?.notifyDataSetChanged()
}
override fun onCancelled(p0: DatabaseError) {
}
})
}

Get data from a Firebase Realtime Database child

This my project I have 2 RecyclewView, the first selects the user I want to manipulate, which is working perfectly.
When selecting it I store your id and transfer it to a next screen that should show your medical history (using your id to search your database for your history).
But this recycler view remains blank, does not give an error but also does not return anything, maybe I'm missing the time to put the path to be taken to bring this history.
image BD Firestore: [1]: https://imgur.com/HOxQTsI
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_verificar_historico)
setSupportActionBar(toolbar_historico)
toolbar_historico.setTitle("Titulo Aqui")
userId = intent.extras?.getString("userId")
textViewX.setText(userId)
getLastKey()
val layoutManager = LinearLayoutManager(this)
recycler_view_historico.layoutManager = layoutManager
val dividerItemDecoration = DividerItemDecoration(recycler_view_historico.context, layoutManager.orientation)
recycler_view_historico.addItemDecoration(dividerItemDecoration)
adapter = HistoricoAdapter(this)
recycler_view_historico.adapter = adapter
getHistorico()
recycler_view_historico.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
total_item = layoutManager.itemCount
last_visible_item = layoutManager.findLastVisibleItemPosition()
if (isLoading && total_item <= last_visible_item + ITEM_COUNT) {
getHistorico()
isLoading = true
}
}
})
}
private fun getHistorico() {
if (!isMaxData) {
val query: Query
if (TextUtils.isEmpty(last_node))
query = FirebaseDatabase.getInstance().reference
.child("pacientes/$userId/historico")
.orderByKey()
.limitToFirst(ITEM_COUNT)
else
query = FirebaseDatabase.getInstance().reference
.child("pacientes/$userId/historico")
.orderByKey()
.startAt(last_node)
.limitToFirst(ITEM_COUNT)
query.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
if (p0.hasChildren()) {
val historicoLista = ArrayList<HistoricoRecycle>()
for (snapshot in p0.children)
historicoLista.add(snapshot.getValue(HistoricoRecycle::class.java)!!)
last_node = historicoLista[historicoLista.size - 1].data
if (!last_node.equals(last_key))
historicoLista.removeAt(historicoLista.size - 1)
else
last_node = "end"
adapter.addAll(historicoLista)
isLoading = false
} else {
isLoading = false
isMaxData = true
}
}
})
}
}
private fun getLastKey() {
val get_last_key = FirebaseDatabase.getInstance().getReference()
.child("pacientes/$userId/historico")
.orderByKey()
.limitToLast(1)
get_last_key.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
for (userSnapShot in p0.children)
last_key = userSnapShot.key
}
})
}

Cannot fetch messages from another user FirebaseDatabase

This is a simple chat messaging app, using Firebase Realtime Database and the Authentication. I have successfully created the database, but I cannot fetch the message from one user to another. Because, when I send the message/click the send button, it creates different nodes, I think its a string node with quotation mark in the name. The node structure I created is user-messages --> fromId(current user uid) --> toUid(to whom the messages are sent).
To make more clear explanation, this is the screenshot of what happened.
I think the problem is, it creates a different nodes with the "uid", which means string. So the database has two nodes, one with the "...", and the other the normal one. For some info, I use some library such as Picasso image load, groupie, and parcelize.
This is the source code for the ChatLogActivity
import...
class ChatLogActivity : AppCompatActivity() {
companion object {
val TAG = "ChatLog"
}
val adapter = GroupAdapter<ViewHolder>()
var toUser: User? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_chat_log)
recyclerview_chat_log.adapter = adapter
toUser = intent.getParcelableExtra(NewMessageActivity.USER_KEY)
titleChatLog.text = toUser?.nama
listenForMessages()
arrowBack.setOnClickListener {
finish()
}
send_button_chat_log.setOnClickListener {
Log.d(TAG, "Attempt to send message.....")
performSendMessage()
}
}
private fun listenForMessages() {
val fromId = FirebaseAuth.getInstance().uid
val toId = toUser?.uid
val ref = FirebaseDatabase.getInstance().getReference("/user-messages/$fromId/$toId")
ref.addChildEventListener(object : ChildEventListener {
override fun onChildAdded(p0: DataSnapshot, p1: String?) {
val chatMessage = p0.getValue(ChatMessage::class.java)
if (chatMessage != null) {
Log.d(TAG, chatMessage.text)
if (chatMessage.fromId == FirebaseAuth.getInstance().uid) {
val currentUser = LatestMessageActivity.currentUser?: return
adapter.add(ChatFromItem(chatMessage.text, currentUser))
} else {
adapter.add(ChatToItem(chatMessage.text, toUser!!))
}
}
}
override fun onCancelled(p0: DatabaseError) {
}
override fun onChildChanged(p0: DataSnapshot, p1: String?) {
}
override fun onChildMoved(p0: DataSnapshot, p1: String?) {
}
override fun onChildRemoved(p0: DataSnapshot) {
}
})
}
private fun performSendMessage() {
val text = edittext_chat_log.text.toString()
val fromId = FirebaseAuth.getInstance().uid
val user = intent.getParcelableExtra<User>(NewMessageActivity.USER_KEY)
val toId = user.uid
val ref = FirebaseDatabase.getInstance().getReference("/user-messages/$fromId/$toId").push()
val toRef = FirebaseDatabase.getInstance().getReference("/user-messages/$toId/$fromId ").push()
if (fromId == null) return
val chatMessage = ChatMessage(ref.key!!, text, fromId, toId, System.currentTimeMillis() / 1000)
ref.setValue(chatMessage)
.addOnSuccessListener {
Log.d(TAG, "Save our chat message: ${ref.key}")
edittext_chat_log.text.clear()
recyclerview_chat_log.scrollToPosition(adapter.itemCount - 1)
}
toRef.setValue(chatMessage)
}
}
class ChatFromItem(val text: String, val user: User) : Item<ViewHolder>() {
override fun getLayout(): Int {
return R.layout.chat_from_row
}
override fun bind(viewHolder: ViewHolder, position: Int) {
val uri = user.profileImageUrl
val targetImageView = viewHolder.itemView.imageViewFrom
Picasso.get().load(uri).into(targetImageView)
viewHolder.itemView.textViewFrom.text = text
}
}
class ChatToItem(val text: String, val user: User) : Item<ViewHolder>() {
override fun getLayout(): Int {
return R.layout.chat_to_row
}
override fun bind(viewHolder: ViewHolder, position: Int) {
val uri = user.profileImageUrl
val targetImageView = viewHolder.itemView.imageViewTo
Picasso.get().load(uri).into(targetImageView)
viewHolder.itemView.textViewTo.text = text
}
}
And this is the ChatMessage, class that store the messages.
class ChatMessage(val id:String, val text: String, val fromId: String, val toId: String, val timeStamp: Long) {
constructor(): this("", "", "", "", -1)
}
I'm very glad if anyone can help this problem. Thank you

Resources