片段的初始化导致动画滞后

问题描述 投票:0回答:1

在编写Android应用程序时,我遇到了一个口吃动画的问题。我使用AHBottomNavigation进行导航,FragNav用于交换片段,而FlexibleAdapter用于RecyclerView。该应用程序由一个活动和五个片段构成。当我尝试切换到应用程序中的第一个片段时,BottomNavigation动画会冻结片刻。它看起来很不雅观。我第二次选择相同的片段,一切顺利。在我看来,初始化片段中的视图是错误的,但我不知道如何以不同的方式做到这一点。

AHBottomNavigation https://github.com/aurelhubert/ahbottomnavigation FragNav https://github.com/ncapdevi/FragNav FlexibleAdapter https://github.com/davideas/FlexibleAdapter

分段

class GradeFragment : BaseFragment(), GradeView {

@Inject
lateinit var presenter: GradePresenter

private val gradeAdapter = FlexibleAdapter<AbstractFlexibleItem<*>>(null, null, true)

companion object {
    fun newInstance() = GradeFragment()
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment_grade, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    presenter.run {
        attachView(this@GradeFragment)
        loadData()
    }
}

override fun initView() {
    gradeAdapter.run {
        isAutoCollapseOnExpand = true
        isAutoScrollOnExpand = true
        setOnUpdateListener { presenter.onUpdateDataList(it) }
        setOnItemClickListener { position ->
            getItem(position).let {
                if (it is GradeItem) {
                    GradeDialog.newInstance(it.grade).show(fragmentManager, it.toString())
                }
            }
        }
    }
    gradeRecycler.run {
        layoutManager = SmoothScrollLinearLayoutManager(context)
        adapter = gradeAdapter
    }
    gradeSwipe.setOnRefreshListener { presenter.loadData(forceRefresh = true) }
}

override fun updateData(data: List<GradeHeader>) {
    gradeAdapter.updateDataSet(data, true)
}

override fun isViewEmpty(): Boolean = gradeAdapter.isEmpty

override fun showEmptyView(show: Boolean) {
    gradeEmpty.visibility = if (show) VISIBLE else GONE
}

override fun showProgress(show: Boolean) {
    gradeProgress.visibility = if (show) VISIBLE else GONE
}

override fun setRefresh(show: Boolean) {
    gradeSwipe.isRefreshing = show
}

主持人

class GradePresenter @Inject constructor(
    private val errorHandler: ErrorHandler,
    private val schedulers: SchedulersManager,
    private val gradeRepository: GradeRepository,
    private val sessionRepository: SessionRepository) : BasePresenter<GradeView>(errorHandler) {

override fun attachView(view: GradeView) {
    super.attachView(view)
    view.initView()
}

fun loadData(forceRefresh: Boolean = false) {
    disposable.add(sessionRepository.getSemesters()
            .map { it.single { semester -> semester.current } }
            .flatMap { gradeRepository.getGrades(it, forceRefresh) }
            .map { it.groupBy { grade -> grade.subject } }
            .map { createGradeItems(it) }
            .subscribeOn(schedulers.backgroundThread())
            .observeOn(schedulers.mainThread())
            .doFinally { view?.setRefresh(false) }
            .doOnSuccess { if (it.isEmpty()) view?.showEmptyView(true) }
            .doOnError { view?.run { if (isViewEmpty()) showEmptyView(true) } }
            .subscribe({ view?.updateData(it) }) { errorHandler.proceed(it) })
}

private fun createGradeItems(items: Map<String, List<Grade>>): List<GradeHeader> {
    return items.map {
        val gradesAverage = calcAverage(it.value)
        GradeHeader().apply {
            subject = it.key
            average = view?.run {
                if (gradesAverage == 0f) emptyAverageString()
                else averageString().format(gradesAverage)
            }.orEmpty()
            number = view?.gradeNumberString(it.value.size).orEmpty()
            subItems = (it.value.map { item ->
                GradeItem().apply {
                    grade = item
                    weightString = view?.weightString().orEmpty()
                    valueColor = getValueColor(item.value)
                }
            })
        }
    }
}

fun onUpdateDataList(size: Int) {
    if (size != 0) view?.showProgress(false)
}
android performance android-fragments kotlin bottomnavigationview
1个回答
0
投票

几天后,我设法通过将SDK更新到版本28来解决问题.RecyclerView在充气时不再导致动画堵塞

© www.soinside.com 2019 - 2024. All rights reserved.