I would have bit different setup. I did similar thing for my server browser.
Make custom widget that handles single line of your list. It needs to connect (hook) to data structure that holds information about media files. For eg i hold all data in game_mode blueprint in array of structs. Game mode blueprint because it is easy to find reference, is created early after loading map etc. Each widget hooks to dispatcher that is triggered by game mode blueprint every time i need to change list. Also each widget remembers which index of array it handles, and checks only against that array element. So every time i change list of found servers i call dispatcher, then all widgets automatically update and copy single cell (one they need to handle) from array in game_mode. Then in those widgets update event i read data from that copied cell and manage widget.
When i have that single line widget ready i just make dynamic list of such widgets in some “parent” widget in my cast it was browser list.
Remember you cannot destroy widgets, so better way is to create as many as you need for list, then collapse ones that are not needed. In my case if line widget detects that it should handle array element that is greater than max index it collapses self. Also parent widget on update checks if it created enough child widgets to hold whole array. For mobile game you could create only as many widgets as maximum visible number, then adjust index of data array they should handle.