تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ رضا فرجی
مشکل loading view
جامعه جاوا (اندروید) ایجاد شده در ۲۸ فروردین ۱۴۰۰

سلام دوستان وقت بخیر. من موقعی که روی نمایش همه محصولات کلیک میکنم و loading view نشون داده میشه، اگر قبل از لود شدن کامل صفحه و در حین اجرا loading view روی back بزنم برنامه به ارور برخورد می‌کنه. عکس ارور رو پیوست میکنم. ممنون میشم اگه تونستید راهنمایی کنید.

سلام وقتتون بخیر

 

من کلاس‌های مربوطه رو براتون قرار میدم تا جایگزین کنین و ارورتون رو رفع کنین:

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 بزنیم این مشکل پیش میاد

رضا فرجی ۳۰ فروردین ۱۴۰۰، ۱۳:۳۰

بله درسته من کلا سینگل اکتیویتی کار کردم. بنظرت کدوم قسمت‌ها باید تغییرات ایجاد کنم برای رفع این مشکل؟

رضا فرجی ۳۰ فروردین ۱۴۰۰، ۱۴:۵۸