【问题标题】:Firebase recyclerview always refreshes and losses its scroll position when starting new activity and returningFirebase recyclerview 在开始新活动并返回时始终刷新并丢失其滚动位置
【发布时间】:2020-10-03 15:52:06
【问题描述】:

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

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);
    }
}

【问题讨论】:

    标签: android firebase kotlin android-recyclerview


    【解决方案1】:

    我在我的代码中使用这个方法检查它

     private fun updateRecycler(){
        val recyclerViewState = recyclerView.layoutManager?.onSaveInstanceState()
        recyclerView.adapter.notifyDataSetChanged()
        recyclerView.layoutManager?.onRestoreInstanceState(recyclerViewState)
    }
    

    我看到你更新数据时使用这种方法

    recyclerView.setAdapter(adapter)
    

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

    【讨论】:

    • 从哪里调用上述函数?
    • @Rajesh 当您更改适配器的数据并需要刷新时
    • 不幸的是我是新手。我没有更改适配器的数据。基本上遵循这样的例子:grokonez.com/android/…
    • 请让我知道您希望我更改什么并尝试。我在 onStart 中设置了一次适配器,还尝试将所有内容从 onStart 移动到 onCreate,但仍然没有效果。
    【解决方案2】:

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

    保存recyclerview scrollView的状态

    1.做一个变量

    private Parcelable scroll_state;
    

    2。在 onPause() 中保存状态

    scroll_state = linearLayoutManager.onSaveInstanceState();
    

    3.在 onResume() 中恢复状态

    linearLayoutManager.onRestoreInstanceState(scroll_state);
    

    注意:这里的linearlayoutmanager是你recyclerview的layoutmanager。

    【讨论】:

    • 不,很遗憾没有工作。总是丢失滚动位置并刷新
    • 因为你设置的适配器错误。尝试在 OnStart() 中移出您的 recyclerview 设置适配器代码,然后它会正常工作。
    • -我应该从哪里开始移动设置适配器代码?我应该将此代码移动到哪个方法?
    • 尝试将 onStart 中的所有内容移至 onCreate 仍然相同。当我第一次单击产品然后返回时,我可以在其位置(我想要的)看到相同的产品,但是当我滚动并单击下一个产品时,当我返回该产品时,该产品向下移动,基本上回收站视图是刷新和滚动位置不同
    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多