DEV Community

Rahul Chowdhury ๐Ÿ•ถ
Rahul Chowdhury ๐Ÿ•ถ

Posted on

Day 9: Display list of elephants

I finally added a RecyclerView to display the list of elephants on the home fragment which is ElephantListFragment.

With a mocktail of ListAdapter, Data Binding and DiffUtil, populating data to the RecyclerView in an efficient way was damn easy.

Here's my sleek adapter:

class ElephantListAdapter : ListAdapter<Elephant, ElephantListAdapter.ViewHolder>(ElephantDiffCallback()) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ElephantListItemBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )

        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val elephant = getItem(position)
        holder.bind(elephant, createClickListener(elephantName = elephant.name))
    }

    class ViewHolder(
        private val elephantListItemBinding: ElephantListItemBinding
    ) : RecyclerView.ViewHolder(elephantListItemBinding.root) {

        fun bind(item: Elephant, listener: View.OnClickListener) {
            elephantListItemBinding.apply {
                elephant = item
                clickListener = listener
                executePendingBindings()
            }
        }
    }

    private fun createClickListener(elephantName: String): View.OnClickListener {
        return View.OnClickListener {
            val navArgs = Bundle()
            navArgs.putString("elephantName", elephantName)

            it.findNavController().navigate(R.id.elephantProfileFragment, navArgs)
        }
    }
}

private class ElephantDiffCallback : DiffUtil.ItemCallback<Elephant>() {
    override fun areItemsTheSame(oldItem: Elephant, newItem: Elephant): Boolean =
        oldItem.id == newItem.id

    override fun areContentsTheSame(oldItem: Elephant, newItem: Elephant): Boolean =
        oldItem == newItem
}

Polishes can be done here and there which I'll do in some time.

Check out the repo, here: https://github.com/rahulchowdhury/elly

Next, I would like to target UI testing with Espresso. Any handy guide for me?

Top comments (0)