Displaying Results in RecyclerView

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 view
                photoRecyclerView.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).

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.135.205.146