For your last task in this chapter, you will switch to the view layer and get PhotoGalleryFragment’s RecyclerView to display some titles.
First, define a ViewHolder class within PhotoGalleryFragment.
Listing 24.33 Adding a ViewHolder
implementation (PhotoGalleryFragment.kt
)
class PhotoGalleryFragment : Fragment() { ... override fun onViewCreated(view: View, savedInstanceState: Bundle?) { ... } private class PhotoHolder(itemTextView: TextView) : RecyclerView.ViewHolder(itemTextView) { val bindTitle: (CharSequence) -> Unit = itemTextView::setText } ... }
Next, add a RecyclerView.Adapter to provide PhotoHolders as needed based on a list of GalleryItems.
Listing 24.34 Adding a RecyclerView.Adapter
implementation (PhotoGalleryFragment.kt
)
class PhotoGalleryFragment : Fragment() { ... private class PhotoHolder(itemTextView: TextView) : RecyclerView.ViewHolder(itemTextView) { val bindTitle: (CharSequence) -> Unit = itemTextView::setText } private class PhotoAdapter(private val galleryItems: List<GalleryItem>) : RecyclerView.Adapter<PhotoHolder>() { override fun onCreateViewHolder( parent: ViewGroup, viewType: Int ): PhotoHolder { val textView = TextView(parent.context) return PhotoHolder(textView) } override fun getItemCount(): Int = galleryItems.size override fun onBindViewHolder(holder: PhotoHolder, position: Int) { val galleryItem = galleryItems[position] holder.bindTitle(galleryItem.title) } } ... }
Now that you have the appropriate nuts and bolts in place for RecyclerView, add code to attach an adapter with updated gallery item data when the live data observer callback fires.
Listing 24.35 Adding an adapter to the recycler view when data is available or changed (PhotoGalleryFragment.kt
)
class PhotoGalleryFragment : Fragment() { ... override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) photoGalleryViewModel.galleryItemLiveData.observe( this, Observer { galleryItems ->Log.d(TAG, "Have gallery items from ViewModel $galleryItems")// Eventually, update data backing the recycler viewphotoRecyclerView.adapter = PhotoAdapter(galleryItems) }) return view } ... }
With that, your work for this chapter is complete. Run PhotoGallery, and you should see text displayed for each GalleryItem you downloaded (similar to Figure 24.2).