https://kotlinlang.org logo
#android
Title
# android
m

Mark

11/02/2018, 5:38 AM
Is there some sample code out there for a recyclerview adapter using
produce{}
(coroutines)
g

gildor

11/02/2018, 5:46 AM
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

Mark

11/02/2018, 5:47 AM
Yes, but that can be worked around
g

gildor

11/02/2018, 5:48 AM
How?
m

Mark

11/02/2018, 5:48 AM
by adding received items to a list on the main thread
g

gildor

11/02/2018, 5:48 AM
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

Mark

11/02/2018, 5:49 AM
Imagine some complex logic that calculates lots of items. I just want to show those via an adapter. Is there another way?
g

gildor

11/02/2018, 5:49 AM
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

Mark

11/02/2018, 5:49 AM
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

gildor

11/02/2018, 5:52 AM
Wait/notify? But this will API of monitors it will block you main thread
m

Mark

11/02/2018, 5:52 AM
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

gildor

11/02/2018, 5:52 AM
Not sure that I get it
yes, you can of course do something like that, but you cannot use directly with RecyclerView
m

Mark

11/02/2018, 5:53 AM
Exactly, so I’m looking for whether someone has already hooked up the adapter with a Channel
g

gildor

11/02/2018, 5:53 AM
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

Mark

11/02/2018, 5:53 AM
Nope, it’s much more complex than that.
g

gildor

11/02/2018, 5:54 AM
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

Mark

11/02/2018, 5:55 AM
Right
g

gildor

11/02/2018, 5:55 AM
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

Mark

11/02/2018, 5:55 AM
Yes sure
This is what I had to do when using the wait/notify approach
g

gildor

11/02/2018, 5:56 AM
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

Mark

11/02/2018, 5:58 AM
It sounds like a perfectly useful thing to have a ChannelAdapter, like we had a CursorAdapter, just a little more complex
g

gildor

11/02/2018, 5:58 AM
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

Mark

11/02/2018, 6:00 AM
Same could be said for Cursor no?
g

gildor

11/02/2018, 6:00 AM
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

Mark

11/02/2018, 6:01 AM
what do you mean “updated”?
g

gildor

11/02/2018, 6:02 AM
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

Mark

11/02/2018, 6:03 AM
I mean when you said some channels “new and updated”
g

gildor

11/02/2018, 6:04 AM
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

Mark

11/02/2018, 6:05 AM
ok
m

maddy

11/02/2018, 7:02 AM
That makes sense. So a combination of Paging Library and a producer which outputs the requested number of items?
g

gildor

11/02/2018, 7:03 AM
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

maddy

11/02/2018, 7:04 AM
A producer wrapping a producer