根据 Android 中的条件创建日期列表

Create Date List with conditions in Android

我正在使用带日期的 ViewPager 2Paging 3 库。我正在尝试创建一个具有特定大小的日期列表,即列表中的项目数,一些重要条件是:-

1. 列表将在结束日期之前创建日期。

2. 否则,列表将创建无限日期。

第一个例子

我的列表的大小将始终小于或等于 5,并且我正在传递 初始日期 作为当前日期,没有结束范围。

....... unlimited pages on negative side

page -1 -> [23/09/2021, 24/09/2021, 25/09/2021, 26/09/2021, 27/09/2021]

page 0  -> [28/09/2021, 29/09/2021, 30/09/2021, 01/10/2021, 02/10/2021]

page 1  -> [03/10/2021, 04/10/2021, 05/10/2021, 06/10/2021, 07/10/2021]

 ....... till unlimited **pages**

第二个例子

我将 初始日期 作为 26/09/2021 并将 结束日期 作为 28/09/2021

....... unlimited pages on negative side
    
    page -1 -> [21/09/2021, 22/09/2021, 23/09/2021, 24/09/2021, 25/09/2021]
    
    page 0  -> [26/09/2021, 27/09/2021, 28/09/2021]

..... end if we pass end date

ViewPagerDataSource.kt

class ViewPagerDataSource(private val pageSize: Int = 5,
        private val initialDate: Date,
        private val endLimitDate: Date?) {

    fun listOfDates(pageNumber: Int): List<Date> {

        val dates = mutableListOf<Date>()
        val startDateForPage = getStartDate(pageNumber)
        val tempCalendar = Calendar.getInstance()

        tempCalendar.time = startDateForPage
        val lastDateForPage = getLastDate(startDateForPage)

        while (tempCalendar.time < lastDateForPage) {
            if (endLimitDate == null || tempCalendar.time.before(endLimitDate) || tempCalendar.time == endLimitDate) {
                dates.add(tempCalendar.time)
                tempCalendar.add(Calendar.DATE, 1)
            } else {
                break
            }
        }
        return dates
    }

    private fun getStartDate(pageNumber: Int): Date {
        if (pageNumber == 0) {
            return initialDate
        } else {
            Calendar.getInstance().let {
                it.time = initialDate
                it.add(Calendar.DATE, pageNumber * pageSize)
                return it.time
            }
        }
    }

    private fun getLastDate(firstDateForPage: Date): Date {
        Calendar.getInstance().let {
            it.time = firstDateForPage
            it.add(Calendar.DATE, pageSize)
            return it.time
        }
    }
}

这个逻辑没有输出正确的顺序。因为我的初始日期是 28/09/21

....... unlimited pages on negative side
    
    page 0 -> [23/09/2021, 24/09/2021, 25/09/2021, 26/09/2021, 27/09/2021]
    
    page 1  -> [28/09/2021, 29/09/2021, 30/09/2021, 01/10/2021, 02/10/2021]
       
....... till unlimited **pages**

我的预期结果是上面的第一个示例

有谁知道我的程序逻辑哪里做错了吗?

在@broot anwser 之后我添加了我的整个代码

我正在尝试使用 paging 3 依赖项的 alpha

implementation "androidx.paging:paging-runtime-ktx:3.0.0-alpha09"

ViewPagerPagingSource

class ViewPagerPagingSource(
    private val dataSource: ViewPagerDataSource
) : PagingSource<Int, Date>() {

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Date> {
        val position = params.key ?: 0

        return try {
            val data = dataSource.listOfDates(position)
            LoadResult.Page(
                data = data,
                prevKey = if (data.isEmpty()) null else position - 1,
                nextKey = if (data.isEmpty()) null else position + 1,
                itemsBefore = LoadResult.Page.COUNT_UNDEFINED,
                itemsAfter = LoadResult.Page.COUNT_UNDEFINED
            )
        } catch (exception: IOException) {
            LoadResult.Error(exception)
        }
    }
}

ViewPagerViewModel

class ViewPagerViewModel(app: Application) : AndroidViewModel(app) {

    private val dataSource = ViewPagerDataSource(5, currentDate(), endWeek())

    val dataList =
        Pager(config = PagingConfig(
            pageSize = 5,
            enablePlaceholders = true
        ), pagingSourceFactory = {
            ViewPagerPagingSource(dataSource)
        }).flow

    private fun currentDate(): Date {
        val calendar = Calendar.getInstance()
        return calendar.time
    }

    private fun endWeek(): Date {
        val week: Calendar = Calendar.getInstance()
        week.add(Calendar.WEEK_OF_YEAR, 1)
        return week.time
    }
}

如果我使用的是上面的库版本,它在索引 0 下工作正常。但是我转到稳定版本的分页库 3

implementation "androidx.paging:paging-runtime-ktx:3.0.1"

它导致我的分页索引出现问题。所以我将位置 0 更改为 1。按照@broot 的建议,它工作正常。但是为什么这个问题会导致,当将库更改为稳定版本时。使用索引 0 或 1 的正确方法是什么?

ViewPagerPagingSource.kt

val position = params.key ?: 1

对我来说,您的代码似乎确实可以正常工作:

val format = SimpleDateFormat("dd/MM/yyyy")
val paging = PagingSource(5, format.parse("28/09/21"), null)

println("page0: " + paging.listOfDates(0).map(format::format))
println("page1: " + paging.listOfDates(1).map(format::format))

输出:

page0: [28/09/0021, 29/09/0021, 30/09/0021, 01/10/0021, 02/10/0021]
page1: [03/10/0021, 04/10/0021, 05/10/0021, 06/10/0021, 07/10/0021]

我的猜测是你实际上误用了它并且错误在另一个地方。例如,您收到的页面是 1 索引的,而您假设它是 0 索引的。然后你直接将它与你的代码一起使用,它是 0 索引的。如果是这样的话,那么传给listOfDates().

的页码只需要减1就可以了