1. 程式人生 > 程式設計 >Android RecycleView滑動停止後自動吸附效果的實現程式碼(滑動定位)

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)//二次滑動
   }
  }
 }
}

結束

到此這篇關於Android RecycleView滑動停止後自動吸附效果的實現程式碼(滑動定位)的文章就介紹到這了,更多相關Android RecycleView滑動定位內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!