簡體   English   中英

保存和恢復 FirebaseUI RecyclerView 滾動狀態

[英]Saving and Restoring FirebaseUI RecyclerView scroll state

我是開發新手,大部分編碼都是一般的,並且正在嘗試通過在 Kotlin 中構建應用程序來學習。 我有一些基本功能正在運行,但是在從其他活動返回時,我無法嘗試讓 RecyclerView 保持其滾動位置。 我已經搜索並嘗試了不同的方法,但可能由於我缺乏經驗,我無法讓它們起作用。 我有一種看起來很有希望的方法,但我不知道如何或在哪里放置提供的代碼。

我嘗試應用的方法

class MainActivity : AppCompatActivity() {
    private val db = FirebaseFirestore.getInstance()
    private val notebookRef = db.collection("Notebook")
    private lateinit var adapter: NoteAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val buttonAddNote =
            findViewById<FloatingActionButton>(R.id.button_add_note)
        buttonAddNote.setOnClickListener {
            startActivity(
                Intent(
                    this@MainActivity,
                    NewNoteActivity::class.java
                )
            )
        }
        setUpRecyclerView()
    }

    private fun setUpRecyclerView() {
        val query: Query = notebookRef.orderBy("priority", Query.Direction.DESCENDING)
        val options = FirestoreRecyclerOptions.Builder<Note>()
            .setQuery(query, Note::class.java)
            .build()
        adapter = NoteAdapter(options)
        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        recyclerView.setHasFixedSize(true)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = adapter
    }

    override fun onStart() {
        super.onStart()
        adapter.startListening()
    }

    override fun onStop() {
        super.onStop()
        adapter.stopListening()
    }
}
class Note {
    var title: String? = null
        private set
    var priority = 0
        private set

    constructor() { //empty constructor needed
    }

    constructor(title: String?, priority: Int) {
        this.title = title
        this.priority = priority
    }
}
class NoteAdapter(options: FirestoreRecyclerOptions<Note>) :
    FirestoreRecyclerAdapter<Note, NoteAdapter.NoteHolder>(options) {

    override fun onBindViewHolder(
        holder: NoteHolder,
        position: Int,
        model: Note
    ) {
        holder.textViewTitle.text = model.title
        holder.textViewPriority.text = model.priority.toString()
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): NoteHolder {
        val v: View = LayoutInflater.from(parent.context).inflate(
            R.layout.note_item,
            parent, false
        )
        return NoteHolder(v)
    }

    inner class NoteHolder(itemView: View) :
        ViewHolder(itemView) {
        var textViewTitle: TextView = itemView.findViewById(R.id.text_view_title)
        var textViewPriority: TextView = itemView.findViewById(R.id.text_view_priority)
    }
}

從活動返回后,RecyclerView 似乎也重新加載,我希望上述方法也能解決這個問題。 我試過“singleTop”,但這似乎不起作用。

AndroidManifest.xml:

    <activity
            android:name=".MainActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".NewNoteActivity"
            android:parentActivityName=".MainActivity" />

對任何代碼清理的幫助也非常感謝。

我沒有閱讀你的大量代碼實現,但我可以說一些關於 RecyclerView 的重要事情。

RecyclerView 由 5 個參與者組成:

  • 布局中的 RecyclerView
  • ViewHolder(你需要重復的每個View)
  • 采集數據
  • LayoutManager(3 個流行的實現:線性 - 網格 - 交錯)
  • 適配器(使用每個 viewHolder 設置集合中的每個數據)

您只需初始化 1 次:RecyclerView LayoutManager Adapter

因此,在您的 Activity/Fragment 的 onCreate 中,您初始化 Recycler、LayoutManager 和 Adapter。

此后,您只需擔心將更新集合傳遞給適配器。 View的重構,最后一個位置可見,recycler操作……是RecyclerView內部實現,不用擔心那個行為。

您如何在重建場景中保存您的收集數據? 在 saveInstanceState 中?

如果你沒有這個實現,當Activity/Fragment被重構時你得到一個新的Collection數據,這個collection你傳遞給RecyclerView,這家伙認為這是相同的數據還是新的? 如果是新數據,我需要顯示第一個位置,如果不是,我需要顯示最后一個位置可見。

那么,您正在保存您的收藏數據嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM