Android RecycleView滑動停止后自動吸附效果的實(shí)現(xiàn)代碼(滑動定位)
最近有個(gè)需求 要求列表 滑動后第一條 需要和頂部對齊
上網(wǎng)找了找 發(fā)現(xiàn) 官方支持 Recycle + LinearSnapHelper 可以實(shí)現(xiàn)
但我實(shí)際操作加上后 發(fā)現(xiàn)會卡頓 滑動卡頓 沒有以前那種流暢感了
想了想 算了 懶得看源碼 還是自己寫一個(gè)得了
效果圖 :

代碼如下 注釋很清楚了
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以內(nèi) 其實(shí)時(shí)接近停止了 慢速滑動了 這時(shí)我們讓他停止
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 毫秒延時(shí)任務(wù)
}
}
if (r.scrollState != RecyclerView.SCROLL_STATE_SETTLING) {//非自動滑動
isUserControl = false
}
}
})
}
private fun smoothScrollToPosition() {
isUserControl = true
val stickyInfoView = rcy.getChildAt(0) //獲取頭部View 第一個(gè)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)//二次滑動
}
}
}
}
結(jié)束
到此這篇關(guān)于Android RecycleView滑動停止后自動吸附效果的實(shí)現(xiàn)代碼(滑動定位)的文章就介紹到這了,更多相關(guān)Android RecycleView滑動定位內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- android RecycleView實(shí)現(xiàn)下拉刷新和上拉加載
- Android之RecycleView實(shí)現(xiàn)指定范圍的拖動效果
- Android 使用RecycleView列表實(shí)現(xiàn)加載更多的示例代碼
- android RecycleView實(shí)現(xiàn)多級樹形列表
- Android RecycleView實(shí)現(xiàn)Item拖拽效果
- Android RecycleView和線型布局制作聊天布局
- Android移動開發(fā)recycleView的頁面點(diǎn)擊跳轉(zhuǎn)設(shè)計(jì)實(shí)現(xiàn)
- Android使用NestedScrollView?內(nèi)嵌RecycleView滑動沖突問題解決
相關(guān)文章
Android中使用GridView進(jìn)行應(yīng)用程序UI布局的教程
GridView即平常我們見到的類似九宮格的矩陣型布局,只不過默認(rèn)不帶分割線,這里我們就從基礎(chǔ)開始來看一下Android中使用GridView進(jìn)行應(yīng)用程序UI布局的教程2016-06-06
Android開發(fā)筆記之:ListView刷新順序的問題詳解
本篇文章是對Android中ListView刷新順序的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Android Studio三方引用報(bào)錯(cuò)但是項(xiàng)目可以運(yùn)行的解決方案
今天小編就為大家分享一篇關(guān)于Android Studio三方引用報(bào)錯(cuò)但是項(xiàng)目可以運(yùn)行的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
Android Studio實(shí)現(xiàn)簡單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
android 引導(dǎo)界面的實(shí)現(xiàn)方法
現(xiàn)在越來越多程序都有引導(dǎo)頁面了。網(wǎng)上資料不全?,F(xiàn)在自己實(shí)現(xiàn)下。2013-06-06

