Я установил определенное условие о том, когда извлекать данные из Интернета, если последний раз извлекал данные более 10 минут назад, а затем извлекал данные из Интернета, поэтому мне не нужно извлекать данные снова и сновакогда возвращаешься из другого фрагмента.Я написал этот код в onResume
,
Я предполагаю, что данные продукта все еще будут на моем RecyclerView после возврата из другого фрагмента.
Если последняя загрузка данных занимает более 10 минутназад, тогда я могу заполнить представление RecyclerView с данными продукта, как это: -
Но проблема в том, когда я перехожу из дома фрагмент на другойфрагмент, например, если нажать на другую вкладку в нижнем меню навигации, RecyclerView кажется пустым, это просто текстовое представление, которое появляется на экране следующим образом.(Если я снова вернусь к исходному фрагменту, это означает, что в последний раз я получаю данные о продукте с сервера не более 10 минут назад)
панель инструментов и нижняя навигация являются частью моего основного действия, поэтому я изменяю фрагмент в центральной части
- это моя проблема, потому что onDestroy
и onDetach
моего HomeFragment
активируются при изменениик другому фрагменту?
что здесь не так?вот упрощенный код моего домашнего фрагмента
class HomeFragment : androidx.fragment.app.Fragment() {
lateinit var mContext : Context
lateinit var mActivity : FragmentActivity
lateinit var recyclerView1 : RecyclerView
lateinit var fragmentView : View
private var firstProducts = listOf<Product>()
lateinit var firstProductAdapter : ProductListAdapter
override fun onAttach(context: Context) {
super.onAttach(context)
mContext = context
activity?.let { mActivity = it }
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// set up view
fragmentView = inflater.inflate(R.layout.fragment_home, container, false)
recyclerView1 = fragmentView.findViewById(R.id.recyclerView_1)
return fragmentView
}
override fun onResume() {
super.onResume()
if (lastTimeFetchDataIsMoreThan10MinutesAgo) {
getProducts() // when I open the app for the very first time, I fetch the product data
} else {
// when it is more than 10 minutes, do nothing
}
}
override fun onStop() {
super.onStop()
progressBar.visibility = View.INVISIBLE // to ensure the progress bar will always dissapear if move to another destination
}
private fun getProducts(type: String) {
showProgressBar(true)
Product.getProductsFromServer(customerID = userData.id.toString(), type = type) { errorMessage, products ->
errorMessage?.let {
activity?.toast(it)
} ?: run {
val productList = products ?: ArrayList()
setUpRecyclerView(type = type,products = productList)
}
}
showProgressBar(false)
}
private fun setUpRecyclerView(type: String, products: List<Product>) {
val productAdapter = ProductListAdapter(context = mContext,products = products)
val layoutManager = LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false)
if (type == "special") {
firstProductAdapter = productAdapter
firstProducts = products
recyclerView1.adapter = productAdapter
recyclerView1.layoutManager = layoutManager
recyclerView1.setHasFixedSize(true)
}
}
private fun showProgressBar(enable: Boolean) {
if (enable) {
progressBar.visibility = View.VISIBLE
recyclerView1.visibility = View.GONE
selectedProductTextView.visibility = View.GONE
bestSellingProductTextView.visibility = View.GONE
} else {
progressBar.visibility = View.GONE
recyclerView1.visibility = View.VISIBLE
selectedProductTextView.visibility = View.VISIBLE
bestSellingProductTextView.visibility = View.VISIBLE
}
}
}