根据 Android 中的条件创建日期列表
Create Date List with conditions in Android
我正在使用带日期的 ViewPager 2 和 Paging 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就可以了
我正在使用带日期的 ViewPager 2 和 Paging 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()
.