android - 保存和恢复 FirebaseUI RecyclerView 滚动状态
问题描述
我是开发新手,大部分是一般的编码,并且正在尝试通过在 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(您需要重复的每个视图)
- 收集数据
- LayoutManager(3 个流行的实现:线性 - 网格 - 交错)
- 适配器(使用每个 viewHolder 设置集合中的每个数据)
您只需初始化 1 次:RecyclerView LayoutManager Adapter
因此,在您的 Activity/Fragment 的 onCreate 中,您将初始化 Recycler、LayoutManager 和 Adapter。
在此之后,您只需要担心将更新集合传递给适配器。View的重建,最后位置可见,recycler操作……是RecyclerView内部实现,不用担心那个行为。
您如何在重建场景中保存您的收集数据?在保存实例状态?
如果你没有这个实现,当Activity/Fragment被重构时你会得到一个新的Collection数据,这个collection你传递给RecyclerView,而这家伙认为这是相同的数据还是新的?如果是新数据,我需要显示第一个位置,如果不是,我需要显示最后一个可见位置。
那么,您正在保存您的收藏数据吗?
推荐阅读
- puppet - 在不同行中带有双引号的 Puppet heredoc
- javascript - 更改主 SVG 图像中的小元素 (SVG)
- php - yii2 gridview过滤日期
- angular - Angular 5:如何在两个具有相同数据的下拉列表上设置验证?
- javascript - 通过 props 将回调函数传递给子组件在子 vue 中未定义
- java - 需要为给定线程上的所有异常抑制 fillStackTrace()
- java - Jframe 按钮标题不显示
- node.js - 将解析服务器 2.x 升级到 3.x 兼容旧代码库
- javascript - 使用重组时在哪里设置`setInterval`?
- compiler-construction - 编译器:将中间表示变量转换为本机代码