RecyclerView 自动循环滚动
RecyclerView 自动循环滚动
RecyclerView 自动循环滚动
在最近一次开发中,需要用到文章的自动滚动功能,看了其他资料结合需要,总结了一下
自定义 AutoScrollRecyclerView
class AutoScrollRecyclerView(context: Context, attrs: AttributeSet?) : RecyclerView(context, attrs) {
private var mAutoTask: Disposable? = null
fun start() {
if (mAutoTask != null && !mAutoTask!!.isDisposed) {
mAutoTask!!.dispose()
}
/**
* @param initialDelay 第一次执行的延迟时间
* @param period 每次执行的间隔的时间
* @param unit 时间单位
* @param scheduler 线程调度器
* @return Observable对象
*/
mAutoTask = Observable.interval(3000, 300, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe { //垂直自动滑动y轴40
smoothScrollBy(0, 40)
}
}
fun stop() {
if (mAutoTask != null && !mAutoTask!!.isDisposed) {
mAutoTask!!.dispose()
mAutoTask = null
}
}
//禁止手动滑动
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
return true
}
}
自定义NoticeRecyclerViewAdapter使用
/**
* @Description: 描述
* @author: zhanghuaiwang
* @date: 22-2-22
*/
class NoticeRecyclerViewAdapter(data: List<String?>?) : BaseQuickAdapter<String?, BaseViewHolder?>(R.layout.tip_adapter_item, data) {
override fun convert(helper: BaseViewHolder?, item: String?) {
helper?.setText(R.id.it_tv, item)
}
override fun getItem(position: Int): String? {
val newPosition = position % data.size
return data[newPosition]
}
override fun getItemViewType(position: Int): Int {
//count为0。就会出现0%0的情况,这会抛出异常
var conut: Int = headerLayoutCount data.size
if (conut <= 0) {
conut = 1
}
var newPosition = position % conut
return super.getItemViewType(newPosition)
}
override fun getItemCount(): Int {
return Int.MAX_VALUE
}
}
最后使用
class Main2Activity : AppCompatActivity() {
private var mRv: AutoScrollRecyclerView? = null
private var mRv1: AutoScrollRecyclerView? = null
private var data: MutableList<String> = ArrayList<String>()
private var mAdapter: NoticeRecyclerViewAdapter? = null
private var smoothScroller: LinearSmoothScroller? = null
private var mAutoTask: Disposable? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
initData()
initView()
}
private fun initView() {
mRv = findViewById(R.id.am_rv)
mRv1 = findViewById(R.id.am_rv1)
mAdapter = NoticeRecyclerViewAdapter(data)
var layoutManager: LinearLayoutManager = LinearLayoutManager(this)
var decoration: DividerItemDecoration = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
mRv?.layoutManager = layoutManager
mRv?.addItemDecoration(decoration)
mRv?.adapter = mAdapter
mRv1?.layoutManager = layoutManager
mRv1?.addItemDecoration(decoration)
mRv1?.adapter = mAdapter
smoothScroller = object : LinearSmoothScroller(this) {
override fun getVerticalSnapPreference(): Int {
return SNAP_TO_START
}
override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
return 3f / displayMetrics!!.density
}
}
}
private fun initData() {
for (i in 0..9) {
data.add("测试机$i")
}
}
private fun startAuto() {
if (mAutoTask != null && !mAutoTask!!.isDisposed) {
mAutoTask!!.dispose()
}
mAutoTask = Observable.interval(500, 200, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe() {
//滚动到指定Item
smoothScroller?.targetPosition = it.toInt()
mRv?.layoutManager?.startSmoothScroll(smoothScroller)
}
}
private fun stopAuto() {
if (mAutoTask != null && !mAutoTask!!.isDisposed) {
mAutoTask!!.dispose()
mAutoTask = null
}
}
override fun onStart() {
super.onStart()
//开始滚动
startAuto()
//流式滚动效果
mRv1?.start()
}
override fun onStop() {
super.onStop()
//结束滚动
stopAuto()
mRv1?.stop()
}
}
##就是这么简单
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgccefa
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13