软件编程
位置:首页>> 软件编程>> Android编程>> Android RecycleView滑动停止后自动吸附效果的实现代码(滑动定位)

Android RecycleView滑动停止后自动吸附效果的实现代码(滑动定位)

作者:叫我大红领巾  发布时间:2023-06-05 21:23:40 

标签:Android,RecycleView,滑动定位,吸附

最近有个需求 要求列表 滑动后第一条 需要和顶部对齐
上网找了找  发现 官方支持 Recycle + LinearSnapHelper 可以实现
但我实际操作加上后 发现会卡顿 滑动卡顿 没有以前那种流畅感了

想了想  算了 懒得看源码  还是自己写一个得了   

效果图 :

Android RecycleView滑动停止后自动吸附效果的实现代码(滑动定位)

代码如下 注释很清楚了 


package com.example.testapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.testapp.code.note.JoinData
import com.example.testapp.code.note.TheatreJoinerAdapter
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

//isUserControl 表示是否是 第二次定位滑动
@Volatile
private var isUserControl = false
var runnable = Runnable {
 smoothScrollToPosition()//处理rcy定位
}

val list = arrayListOf<JoinData>()
override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_main)
 for (i in 0..50) {
  list.add(JoinData("小名${i}", i))
 }
 rcy.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
 var adapter = TheatreJoinerAdapter(this, list)
 rcy.adapter = adapter
 rcy.addOnScrollListener(object : RecyclerView.OnScrollListener() {
  override fun onScrolled(r: RecyclerView, dx: Int, dy: Int) {
   super.onScrolled(r, dx, dy)
   //判断是否是自动滚动
   if (r.scrollState == RecyclerView.SCROLL_STATE_SETTLING && !isUserControl) {//自动滚动
    //滚动幅度 在 -3 .. 3以内 其实时接近停止了 慢速滑动了 这时我们让他停止
    if (dy in -3..3) {//向下滚动
     r.stopScroll()
    }
   }
  }

override fun onScrollStateChanged(r: RecyclerView, newState: Int) {
   super.onScrollStateChanged(r, newState)
   if (newState == RecyclerView.SCROLL_STATE_IDLE) {//滑动停止
    if (!isUserControl) {
     rcy.postDelayed(runnable, 200)//200 毫秒延时任务
    }
   }
   if (r.scrollState != RecyclerView.SCROLL_STATE_SETTLING) {//非自动滑动
    isUserControl = false
   }
  }
 })
}

private fun smoothScrollToPosition() {
 isUserControl = true
 val stickyInfoView = rcy.getChildAt(0) //获取头部View 第一个view
 val bottom = stickyInfoView.bottom//获取view底部到rcy的顶部高度
 val height = stickyInfoView.measuredHeight//获取view高度
 if (bottom != height) {//去除正好停在正好的位置的情况
  if (bottom >= (height / 2)) {//判断view在上一半还是在下一半
   rcy.smoothScrollBy(0, -(height - bottom))//二次滑动
  } else {
   rcy.smoothScrollBy(0, bottom)//二次滑动
  }
 }
}
}

结束   

来源:https://blog.csdn.net/qq_42535851/article/details/109319524

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com