Is there some sample code out there for a recycler...
# android
m
Is there some sample code out there for a recyclerview adapter using
produce{}
(coroutines)
g
RecyclerView? How do you want to use it in RecyclerView?
You cannot use it as source of items for example, because RecyclerView API is synchronous, you must return item immediately
m
Yes, but that can be worked around
g
How?
m
by adding received items to a list on the main thread
g
Only returning some placeholder
Not sure what you mean
Because of course you can do that
but it means nothing for recycler view
because you have to update adapter and notify it about changes
m
Imagine some complex logic that calculates lots of items. I just want to show those via an adapter. Is there another way?
g
so you can of course use produce as source of items, but you should group them to list, create adapter and set it to recycler view (or notify it about changes)
m
because I don’t want to perform the calculations for items not yet in view
channels seem perfect for this
In Java I would use wait/notify
g
Wait/notify? But this will API of monitors it will block you main thread
m
Yes to stop the complex logic pressing on and calculating items that might not be shown (too far down the list). In other words, a mechanism to pause.
g
Not sure that I get it
yes, you can of course do something like that, but you cannot use directly with RecyclerView
m
Exactly, so I’m looking for whether someone has already hooked up the adapter with a Channel
g
if you know amount of items you can display item placeholders and when of items is ready notify adapter to replace with actual data
m
Nope, it’s much more complex than that.
g
Okay, my main point: you cannot use any asynchronous API directly in adapter, because you have to tell RV about amount of items and ready to create view and bind it to data synchronously, so you already need data to do that.
m
Right
g
Way to connect it to any async API (not only produce) it’s when there is new data, update adapter and notify recycler view
m
Yes sure
This is what I had to do when using the wait/notify approach
g
not sure how it should work tho
just one note, that you need some code that collects data from channel and notifies adapter about new items
m
It sounds like a perfectly useful thing to have a ChannelAdapter, like we had a CursorAdapter, just a little more complex
g
Cursor adapter is pretty different
but in general yes
Of course you can write some adapter for channel, but it highly depends on what is data emitted by this channel'
there is no universal solution
m
Same could be said for Cursor no?
g
because some channel can emit only new items, another new and updated
no, cursor just monitors changes in database + provides some sort (pretty bad) paging for this data
m
what do you mean “updated”?
g
cursor can get notifications when table data updated, and cursor adapter does this, when data updated, adapter also will be updated
but it’s pretty different from how channels work
m
I mean when you said some channels “new and updated”
g
imagine if a channel emits something like:
Copy code
ItemStatus<T>
where
Copy code
data class ItemStatus(val status: ItemStatus, val item: T)
Copy code
enum class ItemStatus {
  New, Updated, Deleted
}
Because if channel emits only
T
, it means that it always new item
but it’s not how you usually want to organise you adapter
you want to fetch at least 1 page to display to user and than get new items or updated ones
m
ok
m
That makes sense. So a combination of Paging Library and a producer which outputs the requested number of items?
g
Yes, it makes sense
produce
in this case is just a source of data, any data, for example it can emits pages of data for Paginng Library
m
A producer wrapping a producer