Search code examples
androidkotlindata-bindingandroid-architecture-components

How to loop on data while inflating layouts?


Do I have to rely on ListView/Recycler view each time I need to loop over data to repeat a layout ?

I totally understand it for long lists of data where scroll/performance is involved, but let's say I am sure i'll only have 0...3max items and need to display in very simple single-line-layout for each (1 image, 1 textview + button).. isn't there a simplier pattern than using adapters ?

Seems like overkill (and a pain to deal with for every little part of my screen where I need to loop overs small lists).

What are the other options while using Components architecture (databinding) ? Manually inflating my layout ? In viewmodel ? fragment? Do I need to create another viewModel specially for this child layout ?

Thanks


Solution

  • I recently have a similar issue recently, but my problem was that of nested lists i.e. I needed to inflate another list inside a recycler view. Here is a minimal example of how I went about it.

    Add a LinearLayout to your layout XML file:

    <LinearLayout
        android:id="@+id/smallList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:list="@{viewModel.yourList}" />
    

    Create a binding adapter where you inflate the items. Like so:

    @BindingAdapter("app:list")
    fun setList(layout: LinearLayout, yourList: List<ListItemModel>) {
        layout.removeAllViews() // Remove previous items if your list does change    
    
        for (listItem in yourList) {
            ListItemBinding.inflate( // inflate your list item
                LayoutInflater.from(layout.context),
                layout, // pass your LinearLayout as root
                true // attachToRoot is true so that the inflated view is added to the LinearLayout
            ).apply {
                // set your binding variables
                this.listItem = listItem 
            }
        }
    }
    

    Note: This is a minimal example to solve the issue since actual data and functionality is unknown. You may want to:

    1. Add a click listener variable to your list item XML file and set that similarly.
    2. Create a custom view for the view if it is to be reused and write the binding adapter there.