سلام وقتتون بخیر
من کلاس های مربوطه رو براتون قرار میدم تا جایگزین کنین و ارورتون رو رفع کنین:
package ir.udmx.nikestore.common
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.children
import androidx.fragment.app.Fragment
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.android.material.snackbar.Snackbar
import io.reactivex.disposables.CompositeDisposable
import ir.udmx.nikestore.R
import ir.udmx.nikestore.feature.auth.AuthActivity
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
abstract class NikeFragment : Fragment(), NikeView {
override val rootView: CoordinatorLayout?
get() = view as CoordinatorLayout
override val viewContext: Context?
get() = context
override fun onStart() {
super.onStart()
EventBus.getDefault().register(this)
}
override fun onStop() {
super.onStop()
EventBus.getDefault().unregister(this)
}
}
abstract class NikeActivity : AppCompatActivity(), NikeView {
override val rootView: CoordinatorLayout?
get() {
val viewGroup = window.decorView.findViewById(android.R.id.content) as ViewGroup
if (viewGroup !is CoordinatorLayout) {
viewGroup.children.forEach {
if (it is CoordinatorLayout) return it
}
throw IllegalStateException("RootView must be instance of CoordinatorLayout")
} else {
return viewGroup
}
}
override val viewContext: Context?
get() = this
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
EventBus.getDefault().unregister(this)
super.onDestroy()
}
}
interface NikeView {
val rootView: CoordinatorLayout?
val viewContext: Context?
fun setProgressIndicator(mustShow: Boolean) {
rootView?.let {
viewContext?.let { context ->
var loadingView = it.findViewById<View>(R.id.loadingView)
if (loadingView == null && mustShow) {
loadingView =
LayoutInflater.from(context).inflate(R.layout.view_loading, it, false)
it.addView(loadingView)
}
loadingView?.visibility = if (mustShow) View.VISIBLE else View.GONE
}
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun showError(nikeException: NikeException) {
viewContext?.let {
when (nikeException.type) {
NikeException.Type.SIMPLE -> showSnackBar(
nikeException.serverMessage ?: it.getString(nikeException.userFriendlyMessage)
)
NikeException.Type.AUTH -> {
it.startActivity(Intent(it, AuthActivity::class.java))
Toast.makeText(it, nikeException.serverMessage, Toast.LENGTH_SHORT).show()
}
}
}
}
fun showSnackBar(message: String, duration: Int = Snackbar.LENGTH_SHORT) {
rootView?.let {
Snackbar.make(it, message, duration).show()
}
}
}
abstract class NikeViewModel : ViewModel() {
val compositeDisposable = CompositeDisposable()
val progressBarLiveData = MutableLiveData<Boolean>()
override fun onCleared() {
compositeDisposable.clear()
super.onCleared()
}
}
package ir.udmx.nikestore.feature.list
import androidx.lifecycle.MutableLiveData
import ir.udmx.nikestore.R
import ir.udmx.nikestore.common.NikeSingleObserver
import ir.udmx.nikestore.common.NikeViewModel
import ir.udmx.nikestore.common.asyncNetworkRequest
import ir.udmx.nikestore.data.Product
import ir.udmx.nikestore.data.repo.ProductRepository
class ProductListViewModel(var sort: Int, val productRepository: ProductRepository) :
NikeViewModel() {
val productsLiveData = MutableLiveData<List<Product>>()
val selectedSortTitleLiveData = MutableLiveData<Int>()
val sortTitles = arrayOf(
R.string.sortLatest,
R.string.sortPopular,
R.string.sortPriceHighToLow,
R.string.sortPriceLowToHigh
)
init {
getProducts()
selectedSortTitleLiveData.value = sortTitles[sort]
}
fun getProducts() {
progressBarLiveData.value = true
productRepository.getProducts(sort)
.asyncNetworkRequest()
.doFinally { progressBarLiveData.value = false }
.subscribe(object : NikeSingleObserver<List<Product>>(compositeDisposable) {
override fun onSuccess(t: List<Product>) {
productsLiveData.value = t
}
})
}
fun onSelectedSortChangedByUser(sort: Int) {
this.sort = sort
this.selectedSortTitleLiveData.value = sortTitles[sort]
getProducts()
}
}
سلام آقا پوریا ممنون بابت پاسخ. من این کدهارو چک کردم و تفاوتی وجود نداشت ولی ارور باقی مونده. فقط در صورتی اتفاق میافته که در صفحه اصلی روی مشاهده همه که میزنیم میره اکتیویتی لیست محصولات، اگر در حین لود کردن و true بودن progress bar روی back بزنیم این مشکل پیش میاد
بله درسته من کلا سینگل اکتیویتی کار کردم. بنظرت کدوم قسمت ها باید تغییرات ایجاد کنم برای رفع این مشکل؟