Скрыть прогрессбар, когда фрагмент возобновлен - PullRequest
1 голос
/ 27 марта 2019

У меня есть этот код в классе ViewModel для отображения индикатора выполнения во время загрузки данных:

class DetailViewModel(
    context: Application,
    private val schedulerProvider: BaseSchedulerProvider,
    private val dataSource: RemoteDataSource
) : AndroidViewModel(context) {

    val isFeedsLoading = ObservableBoolean(false)

    fun showFeeds(goal: SavingsGoal): Disposable? {
        EspressoIdlingResource.increment() // App is busy until further notice
        isFeedsLoading.set(true)
        return dataSource.getFeeds(goal.id)
            .subscribeOn(schedulerProvider.io())
            .observeOn(schedulerProvider.ui())
            .doFinally {
                if (!EspressoIdlingResource.getIdlingResource().isIdleNow) {
                    EspressoIdlingResource.decrement() 
                }
                isFeedsLoading.set(false)
            }
            ?.subscribe({ feeds ->


            }
            ) {
                Timber.e(it)
            }
    }

И макет:

<FrameLayout android:layout_width="match_parent"
                             android:layout_height="match_parent">

                    <androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/list"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            app:layoutManager="LinearLayoutManager"
                            app:items="@{vm.feeds}"/>

                    <ProgressBar
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center"
                            app:visibleGone="@{vm.isFeedsLoading}"/>

                </FrameLayout>

Проблема: когда мы возобновляем фрагмент. Он показывает ProgressBar, и видимость не исчезла, как ожидалось. В чем может быть причина?

И мой фрагмент:

@ActivityScoped
class DetailFragment @Inject
constructor() // Required empty public constructor
    : DaggerFragment() {

    @Inject
    lateinit var viewModelFactory: DetailViewModel.DetailViewModelFactory

    @Inject
    lateinit var goal: SavingsGoal

    private val compositeDisposable = CompositeDisposable()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val viewModel = ViewModelProviders.of(this, viewModelFactory)[DetailViewModel::class.java]

        val root = inflater.inflate(R.layout.fragment_detail, container, false)
        val binding = FragmentDetailBinding.bind(root).apply {
            setVariable(BR.vm, viewModel)
            goal = this@DetailFragment.goal
            lifecycleOwner = this@DetailFragment
        }

        with(root) {

            with(activity as AppCompatActivity) {
                setupActionBar(binding.toolbar) {
                    setDisplayShowTitleEnabled(false)
                    setDisplayHomeAsUpEnabled(true)
                    setDisplayShowHomeEnabled(true)
                }
            }
        }
        binding.vm?.showFeeds(goal)?.let { compositeDisposable.add(it) }

        return root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        compositeDisposable.clear()
    }
}

BindingAdapter:

@BindingAdapter("visibleGone")
fun View.visibleGone(visible: Boolean) {
    visibility = if (visible) View.VISIBLE else View.GONE
}

1 Ответ

1 голос
/ 27 марта 2019

Не уверен, что это то, что вы искали ..?

android:visibility="@{vm.isFeedsLoading} ? View.VISIBLE : View.GONE"

https://stackoverflow.com/a/47746579/7697633

...