EndlessAdapter Updated (Now With More Endlessness!)

An eagle-eyed contributor pointed out an optimization for my EndlessAdapter, one that both simplifies reuse and helps solve a problem in cases where you might run out of data sooner than you had expected.

First, for those of you just tuning in, EndlessAdapter is a decorating Adapter, one that makes it easier for you to support data where you only want to display a subset of the possible items up front, perhaps due to network I/O considerations. When the user scrolls to the bottom, if you indicate there is more data to be had, EndlessAdapter displays a placeholder row while you, in a background thread, go fetch the additional data.

The optimization is for that placeholder row, and comes from a long-forgotten capability of the adapter framework. You can return IGNORE_ITEM_VIEW_TYPE from getItemViewType(). The getItemViewType() method is called for each row, for you to indicate what object pool the AdapterView should use for recycling for this row. Returning IGNORE_ITEM_VIEW_TYPE indicates that this row is not eligible for recycling. Ordinarily, that would be a bad idea — you want to recycle rows wherever possible. However, in this case, since the placeholder row is temporary, we have an ideal use case for IGNORE_ITEM_VIEW_TYPE. For those who have used a former edition of EndlessAdapter, you no longer have to implement rebindPendingView()!

This has a side benefit when it comes to handling problems like network failures, where you had expected to get more data, but now cannot. Just return false from cacheInBackground() and do not do anything in appendCachedData(). EndlessAdapter will simply get rid of the placeholder row.