Android 启动新活动并返回时,Firebase recyclerview始终刷新并丢失其滚动位置

Android 启动新活动并返回时,Firebase recyclerview始终刷新并丢失其滚动位置,android,firebase,kotlin,android-recyclerview,Android,Firebase,Kotlin,Android Recyclerview,“我的Firebase回收器”视图在打开新活动并返回时总是刷新并丢失其滚动位置。在堆栈溢出中尝试了多种解决方案,但没有一种适合我。这是我的密码 class HomeActivity : AppCompatActivity() { private var layoutManager:RecyclerView.LayoutManager? = null private var recyclerViewState: Parcelable? = null private var r

“我的Firebase回收器”视图在打开新活动并返回时总是刷新并丢失其滚动位置。在堆栈溢出中尝试了多种解决方案,但没有一种适合我。这是我的密码

class HomeActivity : AppCompatActivity() {
   private var layoutManager:RecyclerView.LayoutManager? = null
    private var recyclerViewState: Parcelable? = null
    private var recyclerView:RecyclerView? = null

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
recyclerView = findViewById(R.id.recycler_menu)
        layoutManager = LinearLayoutManager(this)
        recyclerView!!.layoutManager = layoutManager
}
override fun onStart() {
        super.onStart()
        var productRef: DatabaseReference = FirebaseDatabase.getInstance().reference.child(PRODUCTS_DB_NAME).child(
            PRODUCT_STATE_ACTIVE)
        var options:FirebaseRecyclerOptions<Products>? = null
            options = FirebaseRecyclerOptions.Builder<Products>().setQuery(productRef, Products::class.java).
            setLifecycleOwner(this).build()
        val adapter = object : FirebaseRecyclerAdapter<Products, ProductViewHolder>(options) {
            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder {
                return ProductViewHolder(LayoutInflater.from(parent.context)
                    .inflate(R.layout.product_items_layout, parent, false))
            }

            protected override fun onBindViewHolder(holder: ProductViewHolder, position: Int, model: Products) {
                holder.txtProductName.text = model.pname
                holder.txtProductDescription.text = model.description
                holder.txtProductPrice.text = "Price = ₹ " + model.price.toString()
                val context = holder.itemView.context
                Picasso.with(this@HomeActivity).load(model.image).networkPolicy(NetworkPolicy.OFFLINE).into(holder.imageView,
                    object: Callback {
                        override fun onSuccess() {
                        }

                        override fun onError() {
                            Picasso.with(this@HomeActivity).load(model.image).into(holder.imageView)
                        }
                    })
                holder.itemView.setOnClickListener {
                    val intent:Intent = Intent(this@HomeActivity, ProductDetailsActivity::class.java)
                    intent.putExtra("pid", model.pid)
                    startActivity(intent)
                }
            }
        }
        val recyclerView:RecyclerView = findViewById(R.id.recycler_menu)
        recyclerView.setAdapter(adapter)
        adapter.startListening()
    }
override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        recyclerViewState = recyclerView!!.getLayoutManager()!!.onSaveInstanceState();

    }

    override fun onResume() {
        super.onResume()
        recyclerView!!.getLayoutManager()!!.onRestoreInstanceState(recyclerViewState);
    }
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        recyclerView!!.getLayoutManager()!!.onRestoreInstanceState(recyclerViewState);
    }
}
class HomeActivity:AppCompatActivity(){
私有变量layoutManager:RecyclerView.layoutManager?=null
私有变量RecycleServiceState:Parcelable?=null
私有变量recyclerView:recyclerView?=null
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u home)
recyclerView=findViewById(R.id.recycler\U菜单)
layoutManager=LinearLayoutManager(此)
回收视图!!.layoutManager=layoutManager
}
覆盖有趣的onStart(){
super.onStart()
var productRef:DatabaseReference=FirebaseDatabase.getInstance().reference.child(PRODUCTS\u DB\u NAME).child(
产品状态(激活)
变量选项:FirebaseRecyclerOptions?=null
options=FirebaseRecyclerOptions.Builder().setQuery(productRef,Products::class.java)。
setLifecycleOwner(this.build())
val适配器=对象:FirebaseRecyclerAdapter(选项){
重写CreateViewHolder(父级:ViewGroup,viewType:Int):ProductViewHolder{
返回ProductViewHolder(LayoutInflater.from(parent.context)
.充气(R.layout.product_items_layout,parent,false))
}
受保护的onBindViewHolder(holder:ProductViewHolder,位置:Int,型号:Products){
holder.txtProductName.text=model.pname
holder.txtProductDescription.text=model.description
holder.txtProductPrice.text=“价格=₹ " + model.price.toString()
val context=holder.itemView.context
毕加索(this@HomeActivity).load(model.image).networkPolicy(networkPolicy.OFFLINE).into(holder.imageView,
对象:回调{
覆盖成功的乐趣(){
}
重写错误(){
毕加索(this@HomeActivity).load(model.image).into(holder.imageView)
}
})
holder.itemView.setOnClickListener{
val intent:intent=intent(this@HomeActivity,ProductDetailsActivity::class.java)
intent.putExtra(“pid”,model.pid)
星触觉(意图)
}
}
}
val recyclerView:recyclerView=findviewbyd(R.id.recycler\u菜单)
recyclerView.setAdapter(适配器)
adapter.startListening()
}
覆盖存储实例状态(超出状态:捆绑){
super.onSaveInstanceState(超出状态)
recyclerViewState=recyclerView!!.getLayoutManager()!!.onSaveInstanceState();
}
重写onResume(){
super.onResume()
recyclerView!!.getLayoutManager()!!.onRestoreInstanceState(recyclerViewState);
}
重写RestoreInstanceState(savedInstanceState:Bundle){
super.onRestoreInstanceState(savedInstanceState)
recyclerView!!.getLayoutManager()!!.onRestoreInstanceState(recyclerViewState);
}
}

如果你想在这里实现你想要的,你必须保存你的回收状态视图滚动视图

保存recyclerview scrollView的状态

1.创建一个变量

private Parcelable scroll_state;
scroll_state = linearLayoutManager.onSaveInstanceState();
2.将状态保存到onPause()

private Parcelable scroll_state;
scroll_state = linearLayoutManager.onSaveInstanceState();
3.在onResume()中恢复状态


注意:这里,linearlayoutmanager是您的recyclerview的布局管理器。

我在代码中使用此方法检查它

 private fun updateRecycler(){
    val recyclerViewState = recyclerView.layoutManager?.onSaveInstanceState()
    recyclerView.adapter.notifyDataSetChanged()
    recyclerView.layoutManager?.onRestoreInstanceState(recyclerViewState)
}
我看到您在更新数据时使用此方法

recyclerView.setAdapter(adapter)

这是个坏主意。您必须设置适配器一次,每次都更改数据。您需要重新考虑代码

否,很遗憾无法正常工作。始终会丢失滚动位置和刷新,因为您设置了错误的适配器。请尝试移出OnStart()中的recyclerview设置适配器代码,然后它将正常工作。-我应该从哪里开始移动设置适配器代码?我应该将此代码移动到哪个方法?尝试将onStart中的所有内容移动到onCreate仍然相同。当我第一次单击产品然后返回时,我可以在其位置看到相同的产品(我想要)但当我滚动并点击下一个产品时,当我回来时,产品向下移动,基本上回收器视图被刷新,滚动位置与调用上述函数的位置不同?@Rajesh当您更改适配器的数据并需要刷新时,很遗憾,我是一个新手。我没有更改适配器的数据。基本上是这样例如:请让我知道您希望我更改什么并尝试。我在onStart中设置了适配器,也尝试了将所有内容从onStart移动到onCreate,但仍然没有效果。