当我尝试在屏幕上显示一个将 RecyclerView 向上滚动的 ImageButton 时,我遇到了以下代码的奇怪行为。
myViewManager = LinearLayoutManager(context)
val minimumScrollPosition = if(resources.getBoolean(R.bool.is_tablet)) 12 else 7
binding.myRecyclerview.apply {
layoutManager = myViewManager
setHasFixedSize(true)
addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
Log.d(TAG, "Position scrolled: ${(recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()}")
if((recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() >= minimumScrollPosition) {
binding.scrollToTopButton.visibility = View.VISIBLE
} else {
binding.scrollToTopButton.visibility = View.GONE
}
}
})
}
这个recyclerview的适配器设置在代码的后面部分;这一切都位于 Fragment 的 onViewCreated 函数中。虽然这在第一次访问该片段时确实有效,但如果我要从前面的页面向后导航(点击 recyclerview 内的一行时的详细信息页面),代码确实满足该条件,但无法制作图像按钮通过视图绑定可见;如果我也使用 view.findViewById 方法,这也适用。
在此之后还有一个奇怪的行为,如果 recyclerview 至少一次将 findFirstVisibleItemPosition 视为 minimumScrollPosition,则按钮确实会通过此 onScrollListener onScrolled 函数回调出现;如果我要向后导航并让 recyclerview 在向前导航之前被点击的位置开始,尽管满足 onScrolled 函数回调中的条件,但按钮不会出现。
我希望有人向我解释这个问题,以及我可以采取的任何补救措施。