Android 带分页3的ViewPager 2在按钮上跳转过多页面单击Kotlin
我正在使用Viewpager 2和分页库处理无限数据。通过分页源的帮助,我成功地创建了创建无限页面的逻辑。我用按钮在两个方向上滑动单页。我添加了项目的链接 观看的视频链接:- Github来源:- 我遇到的问题 当我慢慢点击上一个按钮时,它会滑动一个页面,但如果我快速点击上一个按钮多次,它开始滚动的次数会比我们点击的次数多,直到我们点击viewpager,它才会停止 main活动Android 带分页3的ViewPager 2在按钮上跳转过多页面单击Kotlin,android,kotlin,android-jetpack,android-paging-library,android-paging-3,Android,Kotlin,Android Jetpack,Android Paging Library,Android Paging 3,我正在使用Viewpager 2和分页库处理无限数据。通过分页源的帮助,我成功地创建了创建无限页面的逻辑。我用按钮在两个方向上滑动单页。我添加了项目的链接 观看的视频链接:- Github来源:- 我遇到的问题 当我慢慢点击上一个按钮时,它会滑动一个页面,但如果我快速点击上一个按钮多次,它开始滚动的次数会比我们点击的次数多,直到我们点击viewpager,它才会停止 main活动 import android.os.Bundle import androidx.activity.viewMode
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
private val viewModel by viewModels<ViewPagerViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val adapter = ViewPagerAdapter()
viewpager.adapter = adapter
lifecycleScope.launch {
viewModel.dataList.collectLatest {
adapter.submitData(it)
}
}
next.setOnClickListener {
viewpager.setCurrentItem(viewpager.currentItem.plus(1), true)
}
previous.setOnClickListener {
viewpager.setCurrentItem(viewpager.currentItem.minus(1), true)
}
}
}
import android.util.Log
import java.util.*
class ViewPagerDataSource(
private val pageSize: Int,
private val currentDate: Date
) {
fun loadDataSource(pageNumber: Int): List<Date> {
val dates = mutableListOf<Date>()
val startingDate = startingDate(pageNumber)
val tempCalendar = Calendar.getInstance()
Log.e("startingDate", "" + startingDate)
tempCalendar.time = startingDate
val endingDate = endingDate(startingDate)
Log.e("endingDate", "" + endingDate)
while (tempCalendar.time < endingDate) {
dates.add(tempCalendar.time)
tempCalendar.add(Calendar.DATE, 1)
}
return dates
}
private fun startingDate(pageNumber: Int): Date {
Calendar.getInstance().let {
it.time = currentDate
it.add(Calendar.DATE, pageNumber * pageSize)
return it.time
}
}
private fun endingDate(startingDate: Date): Date {
Calendar.getInstance().let {
it.time = startingDate
it.add(Calendar.DATE, pageSize)
return it.time
}
}
}
import androidx.paging.PagingSource
import java.io.IOException
import java.util.*
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.loadDataSource(position)
LoadResult.Page(
data = data,
prevKey = if (data.isEmpty()) null else position - 1,
nextKey = if (data.isEmpty()) null else position + 1
)
} catch (exception: IOException) {
LoadResult.Error(exception)
}
}
}
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.paging.Pager
import androidx.paging.PagingConfig
import java.util.*
class ViewPagerViewModel(app: Application) : AndroidViewModel(app) {
private val dataSource = ViewPagerDataSource(5, currentDate())
val dataList =
Pager(config = PagingConfig(pageSize = 5, enablePlaceholders = true),
pagingSourceFactory = {
ViewPagerPagingSource(dataSource)
}).flow
private fun currentDate(): Date {
val calendar = Calendar.getInstance()
return calendar.time
}
}