android - 如何使不同的视图 RecyclerView 成为无限循环?
问题描述
我一直在寻找制作recyclerview
轮播,以便在最后一个项目可见时再次填充第一个项目,并且它会一次又一次地显示。现在我知道这个答案已经在这里得到了回答,但是这两个答案都没有解决我的问题。尽管项目数量增加了,但作为 recyclerview 中的项目的片段没有显示任何内容。
我正在膨胀fragments
作为RecyclerView
嵌套在ViewPager
. 接受的答案无法解决我的问题。
代码: RecyclerViewAdapterClass
fun initialize(scrollableData: ArrayList<ScrollableData>, activity: AppCompatActivity) {
this.scrollableData = scrollableData
this.activity = activity
}
override fun getItemCount() = scrollableData.size
override fun getItemViewType(position: Int): Int {
return scrollableData[position].index
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseHolder {
when (viewType) {
ScrollableItems.ABC -> {
val view = parent.inflate(R.layout.view_module_abc, false)
return ABCViewHolder(view, abcPresenterImpl, activity)
}
ScrollableItems.DEF -> {
val view = parent.inflate(R.layout.view_module_def, false)
return DEFViewHolder(view, defControlPresenter, activity)
}
else -> {
val view = parent.inflate(R.layout.view_module_ghi, false)
return GHIViewHolder(view, GHIModulePresenter, activity)
}
}
}
override fun onBindViewHolder(holder: BaseHolder, position: Int) {
holder.bindView()
}
和HomeActivity#setupRecyclerView(...)
private fun setupRecyclerView(scrollableDataList: ArrayList<ScrollableData>) {
linearLayoutManager = CustomLinearLayoutManager(applicationContext, LinearLayout.HORIZONTAL, !DeviceConfig.instance!!.isRegularDevice)
recycler_view.layoutManager = linearLayoutManager
recycler_view.adapter = mainScreenAdapter
mainScreenAdapter.initialize(scrollableDataList, this)
recycler_view.setHasFixedSize(true);
GravityPagerSnapHelper(if (DeviceConfig.instance!!.isRegularDevice) Gravity.START else Gravity.END, true, this).attachToRecyclerView(recycler_view)
recyclerViewScrollListener()
}
和 CustomLinearLayoutManager
class CustomLinearLayoutManager(context: Context, orientation: Int, reverseLayout: Boolean)
: LinearLayoutManager(context, orientation, reverseLayout) {
var isScrollEnabled = true
override fun canScrollHorizontally(): Boolean {
return isScrollEnabled && super.canScrollHorizontally()
}
override fun canScrollVertically(): Boolean {
return isScrollEnabled && super.canScrollVertically()
}
}
请帮我解决这个问题。
解决方案
所以经过广泛搜索,找到了这个解决方案。
所以这就是我所做的
RecyclerViewAdapterClass
fun initialize(scrollableData: ArrayList<ScrollableData>, activity: AppCompatActivity) {
this.scrollableData = scrollableData
this.activity = activity
list = /*listOf(scrollableData.last()) +*/ scrollableData + listOf(scrollableData.first()) //this is very important
}
...
override fun getItemViewType(position: Int): Int {
return list[position % list.size].index
}
HomeActivity#setupRecyclerView(...)
mainScreenAdapter.itemCount.takeIf { it > 1 }
?.apply {
onScrollListener = OnScrollListener(
mainScreenAdapter.itemCount,
linearLayoutManager
) {
//some code here
}
recycler_view.addOnScrollListener(onScrollListener)
recycler_view.scrollToPosition(0)
}
OnScrollListener
internal class OnScrollListener(val itemCount: Int, val layoutManager: LinearLayoutManager,
val stateChanged: (Int) -> Unit) : RecyclerView.OnScrollListener() {
var isLooping = false
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView!!, dx, dy)
val firstItemVisible = layoutManager.findFirstCompletelyVisibleItemPosition()
if (firstItemVisible > 0 && firstItemVisible % (itemCount - 1) == 0) {
// When position reaches end of the list, it sho uld go back to the beginning
isLooping = true
recyclerView?.scrollToPosition(0)
} /*else if (firstItemVisible == 0) {
// When position reaches beginning of the list, it should go back to the end
recyclerView?.scrollToPosition(itemCount-1)
}*/
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView!!, newState)
var loop = newState
if (isLooping) {
loop = 100
isLooping = false
}
stateChanged(loop)
}
}
参考:https ://github.com/tomoima525/CirculerAutoScrollingRecyclerView
推荐阅读
- java - 对自定义 ListView 执行/添加搜索功能
- node.js - 在 javascript 中循环 - 在第一个循环完全结束之前发生回调
- javascript - 使用 React Hooks 更新和传递数据
- amazon-s3 - 使用 lambda 函数通过 s3 存储桶将巨大的 .csv 文件上传到 dynamodb 时出错
- .net - Azure Pipelines:“错误 NETSDK1004:找不到资产文件 '...\project.assets.json'。” 在使用 Cache@2 任务缓存 Nuget 包时在管道中
- python - “StatusQuerySet”对象没有属性“用户”
- javascript - laravel livewire 电线:当我插入 AdjacentHTML 时,点击不起作用
- powerpoint - 更改 pptx 语言编码
- php - preg_match_all 使用 php 的特定目录/路径
- flutter - 滚动视图在颤动中没有响应