public class AsyncListUtil<T> extends Object
It can be used to load Cursor data in chunks without querying the Cursor on the UI Thread while keeping UI and cache synchronous for better user experience.
It loads the data on a background thread and keeps only a limited number of fixed sized chunks in memory at all times.
AsyncListUtil
queries the currently visible range through AsyncListUtil.ViewCallback
,
loads the required data items in the background through AsyncListUtil.DataCallback
, and notifies a
AsyncListUtil.ViewCallback
when the data is loaded. It may load some extra items for smoother
scrolling.
Note that this class uses a single thread to load the data, so it suitable to load data from secondary storage such as disk, but not from network.
This class is designed to work with RecyclerView
, but it does
not depend on it and can be used with other list views.
Modifier and Type | Class and Description |
---|---|
static class |
AsyncListUtil.DataCallback<T>
The callback that provides data access for
AsyncListUtil . |
static class |
AsyncListUtil.ViewCallback
The callback that links
AsyncListUtil with the list view. |
Constructor and Description |
---|
AsyncListUtil(Class<T> klass,
int tileSize,
AsyncListUtil.DataCallback<T> dataCallback,
AsyncListUtil.ViewCallback viewCallback)
Creates an AsyncListUtil.
|
Modifier and Type | Method and Description |
---|---|
T |
getItem(int position)
Returns the data item at the given position or
null if it has not been loaded
yet. |
int |
getItemCount()
Returns the number of items in the data set.
|
void |
onRangeChanged()
Updates the currently visible item range.
|
void |
refresh()
Forces reloading the data.
|
public AsyncListUtil(Class<T> klass, int tileSize, AsyncListUtil.DataCallback<T> dataCallback, AsyncListUtil.ViewCallback viewCallback)
klass
- Class of the data item.tileSize
- Number of item per chunk loaded at once.dataCallback
- Data access callback.viewCallback
- Callback for querying visible item range and update notifications.public void onRangeChanged()
Identifies the data items that have not been loaded yet and initiates loading them in the
background. Should be called from the view's scroll listener (such as
RecyclerView.OnScrollListener.onScrolled(android.support.v7.widget.RecyclerView, int, int)
).
public void refresh()
Discards all the cached data and reloads all required data items for the currently visible range. To be called when the data item count and/or contents has changed.
public T getItem(int position)
null
if it has not been loaded
yet.
If this method has been called for a specific position and returned null
, then
AsyncListUtil.ViewCallback.onItemLoaded(int)
will be called when it finally loads. Note that if
this position stays outside of the cached item range (as defined by
AsyncListUtil.ViewCallback.extendRangeInto(int[], int[], int)
method), then the callback will never be called for
this position.
position
- Item position.null
if it has not been loaded
yet.public int getItemCount()
This is the number returned by a recent call to
AsyncListUtil.DataCallback.refreshData()
.