1616package com.google.firebase.dataconnect.minimaldemo
1717
1818import android.os.Bundle
19+ import android.view.LayoutInflater
1920import android.view.View
21+ import android.view.ViewGroup
2022import androidx.activity.viewModels
2123import androidx.appcompat.app.AppCompatActivity
2224import androidx.lifecycle.flowWithLifecycle
2325import androidx.lifecycle.lifecycleScope
26+ import androidx.recyclerview.widget.LinearLayoutManager
27+ import androidx.recyclerview.widget.RecyclerView
28+ import com.google.firebase.dataconnect.minimaldemo.connector.GetAllItemsQuery
2429import com.google.firebase.dataconnect.minimaldemo.databinding.ActivityListItemsBinding
30+ import com.google.firebase.dataconnect.minimaldemo.databinding.ListItemBinding
2531import kotlinx.coroutines.flow.collectLatest
2632import kotlinx.coroutines.launch
2733
@@ -36,6 +42,7 @@ class ListItemsActivity : AppCompatActivity() {
3642 myApplication = application as MyApplication
3743
3844 viewBinding = ActivityListItemsBinding .inflate(layoutInflater)
45+ viewBinding.recyclerView.layoutManager = LinearLayoutManager (this )
3946 setContentView(viewBinding.root)
4047
4148 lifecycleScope.launch {
@@ -57,18 +64,48 @@ class ListItemsActivity : AppCompatActivity() {
5764 viewBinding.statusText.text = " Loading Items..."
5865 viewBinding.statusText.visibility = View .VISIBLE
5966 viewBinding.recyclerView.visibility = View .GONE
67+ viewBinding.recyclerView.adapter = null
6068 } else if (items != = null ) {
61- viewBinding.statusText.text = " Items: $items "
62- viewBinding.statusText.visibility = View .VISIBLE
63- viewBinding.recyclerView.visibility = View .GONE
69+ viewBinding.statusText.text = null
70+ viewBinding.statusText.visibility = View .GONE
71+ viewBinding.recyclerView.visibility = View .VISIBLE
72+ val oldAdapter = viewBinding.recyclerView.adapter as ? RecyclerViewAdapterImpl
73+ if (oldAdapter == = null || oldAdapter.items != = items) {
74+ viewBinding.recyclerView.adapter = RecyclerViewAdapterImpl (items)
75+ }
6476 } else if (exception != = null ) {
6577 viewBinding.statusText.text = " Loading items FAILED: $exception "
6678 viewBinding.statusText.visibility = View .VISIBLE
6779 viewBinding.recyclerView.visibility = View .GONE
80+ viewBinding.recyclerView.adapter = null
6881 } else {
6982 viewBinding.statusText.text = null
7083 viewBinding.statusText.visibility = View .GONE
7184 viewBinding.recyclerView.visibility = View .GONE
7285 }
7386 }
87+
88+ private class RecyclerViewAdapterImpl (val items : List <GetAllItemsQuery .Data .ItemsItem >) :
89+ RecyclerView .Adapter <RecyclerViewViewHolderImpl >() {
90+
91+ override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): RecyclerViewViewHolderImpl {
92+ val binding = ListItemBinding .inflate(LayoutInflater .from(parent.context), parent, false )
93+ return RecyclerViewViewHolderImpl (binding)
94+ }
95+
96+ override fun getItemCount () = items.size
97+
98+ override fun onBindViewHolder (holder : RecyclerViewViewHolderImpl , position : Int ) {
99+ holder.bindTo(items[position])
100+ }
101+ }
102+
103+ private class RecyclerViewViewHolderImpl (private val binding : ListItemBinding ) :
104+ RecyclerView .ViewHolder (binding.root) {
105+
106+ fun bindTo (item : GetAllItemsQuery .Data .ItemsItem ) {
107+ binding.id.text = item.id.toString()
108+ binding.name.text = item.string
109+ }
110+ }
74111}
0 commit comments