Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add separator at every n position inside recyclerview with Paging3 library?

With the help of new Paging3 library, it has made us easy to insert items/separators in a recyclerview as shown in the google android codelabs tutorial https://developer.android.com/codelabs/android-paging#11 but how to get the logic of inserting items at every n position say as at every position 10 in the recyclerview.

Sample code

fun searchRepo(queryString: String): Flow<PagingData<UiModel>> {
val lastResult = currentSearchResult
if (queryString == currentQueryValue && lastResult != null) {
    return lastResult
}
currentQueryValue = queryString
val newResult: Flow<PagingData<UiModel>> = repository.getSearchResultStream(queryString)
        .map { pagingData -> pagingData.map { UiModel.RepoItem(it) } }
        .map {
            it.insertSeparators<UiModel.RepoItem, UiModel> { before, after ->
                if (after == null) {
                    // we're at the end of the list
                    return@insertSeparators null
                }

                if (before == null) {
                    // we're at the beginning of the list
                    return@insertSeparators UiModel.SeparatorItem("${after.roundedStarCount}0.000+ stars")
                }
                // check between 2 items
                if (before.roundedStarCount > after.roundedStarCount) {
                    if (after.roundedStarCount >= 1) {
                        UiModel.SeparatorItem("${after.roundedStarCount}0.000+ stars")
                    } else {
                        UiModel.SeparatorItem("< 10.000+ stars")
                    }
                } else {
                    // no separator
                    null
                }
            }
        }
        .cachedIn(viewModelScope)
currentSearchResult = newResult
return newResult

How to find the logic of adding an item on every 10th position in the above sample code

fun itemInsert(position: Int): Int {
    return if (position % 10 == 0) //each 10 position is separator 
        SEPARATOR else COMMON
}
like image 739
Pranam Baruah Avatar asked Nov 16 '22 00:11

Pranam Baruah


1 Answers

We just had the same problem and we decided to just manually count the index. We added: val index: Int in RepoItem constructor and the rest is:

val newResult: Flow<PagingData<UiModel>> = repository.getSearchResultStream(queryString)
    .map { pagingData ->
        var index = 0
        pagingData.map { UiModel.RepoItem(it, index++) }
    }
    .map {
        it.insertSeparators<UiModel.RepoItem, UiModel> { before, after ->
            if (before.index % 10) {
                Do something
            }
        }
    }

While this may work if you only append data, it more likely wont work if you set MAX_CACHE_SIZE.

like image 148
Ahmed Ahmedov Avatar answered Dec 29 '22 03:12

Ahmed Ahmedov