I have problem with fetching all data in ArrayList inside collection, its only show last added element everytime, but i need show full list inside RecyclerView of all data.Tried a lot of things, but it doesn't help. Thanks in advance!
Data Model
data class Holder(
val id : String? = null,
val holderHistoryItem: ArrayList<HolderHistItem> = arrayListOf()
data class HolderHistItem(
val id : String? = null,
val instrName: String? = null,
val getTime: String? = null,
val returnTime: String? = null,
)
Function of fetching
@ExperimentalCoroutinesApi
fun getAllInstrumentInHolderHistory(holder: Holder): Flow<State<List<ArrayList<HolderHistItem>>>> =
callbackFlow {
val snapshotListener = holderCollection
.orderBy("name")
.whereEqualTo("id",holder.id)
.addSnapshotListener { value , error ->
val response = if (error == null && value != null) {
trySend(State.loading())
val data = value.documents.mapNotNull { doc ->
doc.toObject(Holder::class.java)?.holderHistoryItem
}
State.success(data)
} else {
State.failed(error.toString())
}
trySend(response)
}
awaitClose {
snapshotListener.remove()
}
}
List Adapter
class HolderHistAdapter : ListAdapter<ArrayList<HolderHistItem>,HolderHistAdapter.ItemHist>(ItemComparator()) {
class ItemHist(view: View) : RecyclerView.ViewHolder(view) {
private val b = HistitemItemBinding.bind(view)
@SuppressLint("SetTextI18n")
fun setData(holderHistItem: ArrayList<HolderHistItem>) = with(b){
holderHistItem.forEach {
tvListName.text = it.instrName.toString()
tvGet.text = it.getTime.toString()
tvReturn.text = it.returnTime.toString()
}
}
companion object {
fun create(parent: ViewGroup): HolderHistAdapter.ItemHist {
return HolderHistAdapter.ItemHist(
LayoutInflater.from(parent.context)
.inflate(R.layout.histitem_item, parent, false)
)
}
}
}
class ItemComparator : DiffUtil.ItemCallback<ArrayList<HolderHistItem>>() {
override fun areItemsTheSame(oldItem: ArrayList<HolderHistItem>, newItem: ArrayList<HolderHistItem>): Boolean {
return oldItem.hashCode() == newItem.hashCode()
}
override fun areContentsTheSame(oldItem: ArrayList<HolderHistItem>, newItem:ArrayList<HolderHistItem>): Boolean {
return oldItem == newItem
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHist {
return ItemHist.create(parent)
}
override fun onBindViewHolder(holder: ItemHist, position: Int) {
holder.setData(getItem(position))
}
}
Load data in adapter
fun observHistoryItem(){
mainViewModel.getAllInstrHistoryItem(holder!!).observe(viewLifecycleOwner,{
when (it) {
is State.Loading -> {
}
is State.Success -> {
if(it.data.isEmpty()){
b.rcHistItem.visibility = View.GONE
b.tvEmptyHist.visibility = View.VISIBLE
}else {
adapterHis.submitList(it.data)
b.rcHistItem.visibility = View.VISIBLE
}
}
is State.Failed -> {
Log.d("Error" , "Error name :${it.message}")
}
}
})
}