android - 当用户将手从屏幕上移开时,如何使 Recycler View 滚动缓慢而流畅?
问题描述
这就是我快速滚动时的当前实现方式。
在第二个中,回收站视图中的所有项目都显示到最后。我想要实现的是如下所示的(现场演示:play store 中的回收站视图),
即使我们快速滚动,它也会显示 1 或 2 个项目,所以感觉很自然。我怎样才能使回收站视图以这种方式运行?
编码:
适配器
class CustomAdapter(private val mList: List<ItemsViewModel>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.card_view_design, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
}
override fun getItemCount(): Int {
return mList.size
}
class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
val imageView: ImageView = itemView.findViewById(R.id.imageview)
val textView: TextView = itemView.findViewById(R.id.textView)
}
}
执行
val recyclerview = findViewById<RecyclerView>(R.id.recyclerview)
recyclerview.layoutManager = LinearLayoutManager(requireContext(), RecyclerView.HORIZONTAL, false)
val data = ArrayList<ItemsViewModel>()
val adapter = CustomAdapter(data)
recyclerview.adapter = adapter
解决方案
当 aRecyclerView
水平滚动时,scrollHorizontallyBy()
会调用 dx 值多次,根据手指的 fling (push) 值,可以使滚动表现得平滑和真实。
vertical 也一样RecyclerView
,scrollVerticallyBy()
用不同的 dy 值调用。
因此,您可以操纵此dx
值以获得所需的行为;在您的情况下,您需要获得较小的dx
.
您会想到一个固定dx
值,但这不会那么自然;相反,您可以将其除以固定数量以缩小相同的 dx 值。
在这里,我使用了一个任意值,您可以根据需要对其进行操作。
因此,您需要在使用水平 recyclerView时使用自定义LinearLayoutManager
& 覆盖 :scrollHorizontallyBy()
class MyLinearLayoutManager(context: Context?, orientation: Int, reverseLayout: Boolean) :
LinearLayoutManager(context, orientation, reverseLayout) {
override fun scrollHorizontallyBy(
dx: Int,
recycler: RecyclerView.Recycler?,
state: RecyclerView.State?
): Int {
var newDx = (dx / 1.2).toInt() // 1.2 is an arbitrary value
if (newDx == 0 && dx != 0) { // To have no 0 values (Optionally)
newDx = 1
}
return super.scrollHorizontallyBy(newDx, recycler, state)
}
}
推荐阅读
- c# - VS 2019 中的 CustomVisualizer 扩展
- django - 为什么 Django serializer.data 步骤很慢?
- python - 如何将正则表达式找到的字符串从一个文件复制到另一个文件,同时保持两个文件的结构?
- java - Java 12.0.1 中的 JavaFX
- wso2 - 如何在 WSO2 API Manager 中发布隐藏在 Spring Cloud Gateway/自定义网关后面的 API
- python - 尝试使用子进程捕获输出时得到奇怪的结果
- mysql - 连接表上的mysql更新是否一致?
- neo4j - neo4j - 返回单个节点实例 - 按属性查询?
- google-chrome-extension - Chrome 中的 openerTabId 更改为未定义
- serial-port - 计算 3964r 串行通信协议的 BCC