添加笔记后如何让RecyclerView自动滚动至顶部?
解决Firestore RecyclerView添加新笔记后自动滚动到顶部的问题
要实现添加新笔记后RecyclerView自动跳转至顶部,可通过监听FirestoreRecyclerAdapter的数据集变化触发滚动操作,具体修改如下:
关键修改:注册数据观察者
在NotesActivity的setUpRecyclerView方法中,初始化Adapter后添加RecyclerView.AdapterDataObserver,监听新项插入事件——因为查询按时间倒序排列,新笔记会插入到数据集顶部(位置0),此时直接触发滚动操作即可。
修改后的Notes.kt代码:
import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.cashmates.daos.NoteDao import com.example.cashmates.models.Note import com.firebase.ui.firestore.FirestoreRecyclerOptions import com.google.firebase.firestore.Query import kotlinx.android.synthetic.main.activity_notes.* class Notes : AppCompatActivity() { private lateinit var noteDao: NoteDao private lateinit var adapter: NoteAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_notes) fab.setOnClickListener { val intent3 = Intent(this, CreateNoteActivity::class.java) startActivity(intent3) } setUpRecyclerView() } private fun setUpRecyclerView() { noteDao = NoteDao() val notesCollections = noteDao.noteCollections val query = notesCollections.orderBy("time", Query.Direction.DESCENDING) val recyclerViewOptions = FirestoreRecyclerOptions.Builder<Note>().setQuery(query, Note::class.java).build() adapter = NoteAdapter(recyclerViewOptions) recyclerView.adapter = adapter recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.itemAnimator = null // 监听新项插入,自动滚动到顶部 adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { super.onItemRangeInserted(positionStart, itemCount) if (positionStart == 0) { recyclerView.scrollToPosition(0) } } }) } override fun onStart() { super.onStart() adapter.startListening() } override fun onStop() { super.onStop() adapter.stopListening() } }
原理说明
- 由于查询按
time字段倒序排列,新添加的笔记会被FirestoreRecyclerAdapter插入到数据集的第0位(RecyclerView顶部)。 - 通过
AdapterDataObserver捕获onItemRangeInserted事件,判断插入位置为0时,调用scrollToPosition(0)直接跳转至顶部。 - 配合你已设置的
recyclerView.itemAnimator = null,滚动操作会立即生效,无动画延迟。
内容的提问来源于stack exchange,提问作者Ajay Satpati
相关产品推荐
相关产品推荐

