مشکل loading view

پرسیده شده
فعالیت 1104 روز پیش
دیده شده 402 بار
0

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

فایل پیوست

رضا فرجی
رضا فرجی

28 فروردین 00

0
حذف شده

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

 

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

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()
    }
}

 

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

28 فروردین 00

0
حذف شده

سلام آقا پوریا ممنون بابت پاسخ. من این کدهارو چک کردم و تفاوتی وجود نداشت ولی ارور باقی مونده. فقط در صورتی اتفاق میافته که در صفحه اصلی روی مشاهده همه که میزنیم میره اکتیویتی لیست محصولات، اگر در حین لود کردن و true بودن progress bar روی back بزنیم این مشکل پیش میاد

فایل پیوست

رضا فرجی

توسط

رضا فرجی

30 فروردین 00

حذف شده
سلام رضا جان من روی اپلیکیشن خودم این موضوع رو تست کردم اما با چنین مشکلی برنخوردم موضوعی که هستش شما دارید از فرگمنت ها استفاده میکنین چون ارور از ProductListFragment هم دریافت شده ایا پروژه رو با فرگمت ها پیش میبرید چون توی اموزش از Activity استفاده کردیم اگر درست گفته باشم اگر چنین هست احتمالا مشکل از همونجاست
پوریا شفیعی

30 فروردین 00

0
حذف شده

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

فایل پیوست

رضا فرجی

توسط

رضا فرجی

30 فروردین 00