从另一个屏幕返回后,Recyclerview 刷新 - Android 导航

时间:2021-06-16 04:19:57

标签: android google-cloud-firestore android-recyclerview android-jetpack android-jetpack-navigation

我有一个产品列表页面。 recyclerview 充满了来自 Firebase Firestore 的数据。当我点击任何产品时,它会转到详细信息页面。

view.findNavController().navigate(R.id.action_nav_products_to_productDetailFragment, bundle)

但是如果我点击后退按钮,我会调用 popBackStack() 并返回到上一个屏幕并重新加载。

findNavController().popBackStack()

如果我也点击系统后退按钮,也会发生同样的行为。

我查看了一些其他 Stackoverflow 帖子并遵循了一些答案。但没有任何帮助。

我尝试过的一个是,在 onCreateView 我检查适配器初始化,如果已经初始化,它不会设置 recylerview 的适配器。但是应用这个逻辑后,我才知道,即使我不将适配器设置为recyclerview,它也会自动重新加载。

我检查了谷歌文档提供的样本,它工作正常。但我可以看到我的情况唯一的区别是 Firestore。

implementation 'com.google.firebase:firebase-firestore-ktx:22.1.2'
implementation 'com.google.firebase:firebase-database:19.7.0'
implementation 'com.google.firebase:firebase-storage-ktx:19.2.2'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation "androidx.navigation:navigation-fragment:$2.4.0-alpha01"
implementation "androidx.navigation:navigation-ui:$2.4.0-alpha01"
implementation "androidx.navigation:navigation-fragment-ktx:$2.4.0-alpha01"
implementation "androidx.navigation:navigation-ui-ktx:$2.4.0-alpha01"

我也尝试了稳定版的导航。但同样的行为。

基本片段代码

abstract class BaseFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        parent: ViewGroup?,
        savedInstanseState: Bundle?
    ): View? {
        val view =  getFragmentView(inflater, parent, savedInstanseState)
        view.findViewById<Toolbar>(R.id.toolbar)?.let {
            it.title = getTitle()
            it.setNavigationOnClickListener { (activity as HomeActivity).openDrawer() }
        }
        return view
    }

    abstract fun getFragmentView(
        inflater: LayoutInflater,
        parent: ViewGroup?,
        savedInstanceState: Bundle?
    ): View

    abstract fun getTitle():String
}

下面列出片段代码

class ProductsFragment : BaseFragment() {

    private val productsViewModel: ProductsViewModel by activityViewModels()
    private val categoryViewModel: CategoryViewModel by activityViewModels()

    override fun getFragmentView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        setUpProductsList()
        return inflater.inflate(R.layout.fragment_products, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        addFab.setOnClickListener {
            findNavController().navigate(R.id.action_nav_products_to_addProductsFragment)
        }
        txtSearch.addTextChangedListener {
            productsViewModel.getProduct(txtSearch.text.toString())
        }
    }

    override fun getTitle(): String {
        return resources.getString(R.string.menu_products)
    }

    private fun setUpProductsList(){
        categoryViewModel.getCategories("").observe(this, Observer {categories->
            productsViewModel.getProduct("").observe(this, Observer {products->
                products.let {
                    val adapter = ProductListingAdapter( products, categories, requireActivity())
                    productRV.adapter = adapter
                    productRV.layoutManager = LinearLayoutManager(requireContext())
                }
            })
        })
    }
}

如果您需要更多信息,请发表评论。我会更新答案。

0 个答案:

没有答案