0

当我登录时它工作正常,进度条将显示在屏幕上。[在主页选项卡中] 但是每次我转到帐户选项卡然后返回主页选项卡片段时,即使它存在于主页中的数据也会继续显示片段选项卡

我使用loadingDialog.startLoadingDialog()andloadingDialog.dismissDialog()之间c.type == DocumentChange.Type.ADDED

如果我尝试使用句柄来延迟线程,当你滑动到主页选项卡时,你需要等待很长时间,所以禁用它

家庭片段

  private fun EventChangeListener() {

        db = FirebaseFirestore.getInstance()
        db.collection("FlashSalesProducts")
            .addSnapshotListener(object : EventListener<QuerySnapshot> {
                override fun onEvent(value: QuerySnapshot?, error: FirebaseFirestoreException?) {
                    if (error != null) {
                        Log.e("Firestore Error", error.message.toString())
                        return
                    }

                    loadingDialog.startLoadingDialog()
                    for (dc: DocumentChange in value?.documentChanges!!) {
                        if (dc.type == DocumentChange.Type.ADDED) {  // Log.i("xxxxFromFireStoreRetrieveProductList:", productList.toString())

                            productList.add(dc.document.toObject(Products::class.java))    //isFavour = null(get from FlashSlaes firebaseStore,settle in future

                        }
                    }
                    productsAdapter.notifyDataSetChanged()
                    loadingDialog.dismissDialog()
//                    var handle : Handler = Handler()
//                    handle.postDelayed({ },1500)

                }
            })

    }

加载对话框

package com.example.myecommerceapp

import android.app.Activity
import android.app.AlertDialog
import android.util.Log
import android.view.LayoutInflater

class LoadingDialog(private val activity : Activity) {

    private lateinit var dialog: AlertDialog

    val TAG = "xxxxxxDialog"

    fun startLoadingDialog(){
        var builder : AlertDialog.Builder = AlertDialog.Builder(activity)
        var inflater : LayoutInflater = activity.layoutInflater
        builder.setView(inflater.inflate(R.layout.custom_loading, null))
        builder.setCancelable(false)
        dialog = builder.create()
        dialog.show()
        Log.i(TAG,"dialog show")
    }

    fun dismissDialog(){
        dialog.dismiss()
        Log.i(TAG,"dialog dismiss")
    }

}

MainActivity处理所有导航栏片段

package com.example.myecommerceapp

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.example.myecommerceapp.databinding.ActivityMainBinding
import com.example.myecommerceapp.ui.Account.AccountFragment
import com.example.myecommerceapp.ui.home.HomeFragment

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private val homeFragment: HomeFragment = HomeFragment()
    private val accountFragment: AccountFragment = AccountFragment()


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // val navView: BottomNavigationView = binding.navView

        binding.bottomNavigationView.setOnItemSelectedListener { item ->
            when (item.itemId) {
                R.id.navigation_home -> replaceFragment(homeFragment)

                R.id.navigation_account -> replaceFragment(accountFragment)
            }
            true
        }


    }

    override fun onBackPressed() {
        if (binding.bottomNavigationView.selectedItemId == R.id.navigation_home) {
            super.onBackPressed()
        } else {
            binding.bottomNavigationView.selectedItemId = R.id.navigation_home
        }
    }

    private fun replaceFragment(fragment: Fragment) {
           supportFragmentManager.beginTransaction().replace(
                R.id.Fragmentcontainer,
                fragment,
                fragment.javaClass.simpleName // retrive name as Tag
            )
                .commit()
    }
}
4

1 回答 1

0

您的实现是硬编码的。您实现片段调用的方式可能是每次更改目的地时都会重新创建它们。尝试使用架构组件(例如使用 MVVM/MVI)来实现这一点。导航使用最新版本的导航组件,现在支持 backstack

于 2021-09-08T04:24:55.947 回答