How to add date separators in recycler view using Paging Library?

前端 未结 6 1523
感动是毒
感动是毒 2021-02-05 10:34

After a lot of searching, I know its possible with regular adapter, but I have no idea how to do it using Paging Library. I don`t need code just a clue.

Example

6条回答
  •  天命终不由人
    2021-02-05 10:59

    You can achieve the same result using insertSeparators in Paging 3 library. Make sure your items are sorted by date.

    Inside or viewmodel retrieve a Pager something like that

    private val communicationResult: Flow> = Pager(
        PagingConfig(
            pageSize = 50,
            enablePlaceholders = false,
            maxSize = 400,
            initialLoadSize = 50
        )
    ) {
        CommunicationPagingSource(repository)
    }.flow.cachedIn(viewModelScope)
    

    After all insert separators like a header

    val groupedCommunicationResult = communicationResult
            .map { pagingData -> pagingData.map { CommunicationHistoryModel.Body(it) } }
            .map {
                it.insertSeparators{ after, before ->
                    if (before == null) {
                        //the end of the list
                        return@insertSeparators null
                    }
    
                    val afterDateStr = after?.createdDate
                    val beforeDateStr = before.createdDate
    
                    if (afterDateStr == null || beforeDateStr == null)
                        return@insertSeparators null
    
                    val afterDate = DateUtil.parseAsCalendar(afterDateStr)?.cleanTime()?.time ?: 0
                    val beforeDate = DateUtil.parseAsCalendar(beforeDateStr)?.cleanTime()?.time ?: 0
    
                    if (afterDate > beforeDate) {
                        CommunicationHistoryModel.Header( DateUtil.format(Date(beforeDate))) // dd.MM.yyyy
                    } else {
                        // no separator
                        null
                    }
                }
            }
    

    cleanTime is required for grouping by dd.MM.yyyy ignoring time

    fun Calendar.cleanTime(): Date {
        set(Calendar.HOUR_OF_DAY, 0)
        set(Calendar.MINUTE, 0)
        set(Calendar.SECOND, 0)
        set(Calendar.MILLISECOND, 0)
        return this.time
    }
    

提交回复
热议问题