我有一个RecyclerView
,希望在用户滚动时设置文本并更改TextView
的可见性。View
应该在用户停止滚动后显示一秒钟,然后取消显示。为此,我有一个RecyclerView.OnScrollListener
。我的代码看起来像这样:
var scrollJob = Job()
var tempText = ""
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (dx != 0 || dy != 0) {
val someText = // compute text from ViewHolder
scrollTextView.visibility = View.VISIBLE
if (someText != tempText) {
scrollTextView.text = someText
tempText = someText
}
}
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
when (newState) {
RecyclerView.SCROLL_STATE_SETTLING -> Log.d("TAG", "state: settling")
RecyclerView.SCROLL_STATE_IDLE -> {
scrollJob.cancel()
scrollJob = lifecycleScope.launch {
delay(1000)
scrollTextView.visibility = View.GONE
}
}
RecyclerView.SCROLL_STATE_DRAGGING -> scrollJob.cancel()
}
}
}
代码运行得很好,我只是想知道我是否不应该在onScrolled
中做那么多事情,因为旧手机可能会有这个问题。SCROLL_STATE_DRAGGING
的问题在于,即使不需要它,也会调用它。
你需要获得scrollTextView的可见性,如果INVISIBLE或GONE,你会使其可见。你不需要让它可见,如果已经可见。。。
if (scrollTextView.getVisibility() != View.VISIBLE)
scrollTextView.visibility = View.VISIBLE
在任何情况下都要做到这一点,这将影响你的表现!