Мое представление, содержащее пользовательские представления, отображается слишком долго - PullRequest
0 голосов
/ 05 марта 2020

Я создал несколько пользовательских представлений, они просты в использовании. Один из них представляет собой вид рециркулятора, который работает как счетчик, чтобы показать время (в минутах или часах), другой - это макет ограничения, который содержит два thoose, один для часов, другой для минут. Но когда я открываю фрагмент, который содержит четыре из этого пользовательского просмотра, это занимает много времени (например, от 5 до 8 секунд). И у меня есть это в logcat, который повторяется много раз: (я покажу вам код после)

  • 2020-03-03 21:25 : 22.165 31096-31096 / com.elfefe.clarity D / HwSplineOverScrollerExImpl: initSplineOverScrollerImpl: mScrollerVelocity равен 0, значение равно 0
  • 2020-03-03 21: 25: 22.165 31096-31096 / com.elfefe.clarity I / FLTAG_FM: класс loadFeature: com.huawei.featurelayer.systemfeature.HwWidget.IHwSplineOverScrollerEx
  • 2020-03-03 21: 25: 22.166 31096-31096 / com .elfefe.clarity I / FLTAG_SFM: getRequireClassLoader () su cc! className: com.huawei.featurelayer.systemfeature.HwWidget.IHwSplineOverScrollerEx
  • 2020-03-03 21: 25: 22.166 31096-31096 / com.elfefe.clarity D / FeatureFactory: loadFeature ( ): com.huawei.featurelayer.systemfeature.HwWidget.IHwSplineOverScrollerEx
  • 2020-03-03 21: 25: 22.166 31096-31096 / com.elfefe.clarity D / FeatureFactory: loadFeature ( ) new IHwSplineOverScrollerEx ()
  • 2020-03-03 21: 25: 22.166 31096-31096 / com.elfefe.clarity D / HwSplineOverScrollerExImpl: initSplineOverScrollerImpl paras: android .widget. 1027 *, com.elfefe.clarity.controlleur. MainActivity@8a41969
  • 2020-03-03 21: 25: 22.166 31096-31096 / com.elfefe.clarity D / HwSplineOverScrollerExImpl: initSplineOverScrollerImpl : mScrollerVelocity равен 0, значение равно 0
  • 2020-03-03 21: 25: 22.191 31096-31130 / com.elfefe.clarity I / OpenGLRenderer: Davey! Продолжительность = 2071ms; Флаги = 0, IntendedVsync = 63784152698766, Vsync = 63786169365352 ** OldestInputEvent = 9223372036854775807, NewestInputEvent = 0, HandleInputStart = 63786177710569, AnimationStart = 63786177815256, PerformTraversalsStart = 63786178750673, DrawStart = 63786179533485, SyncQueued = 63786185737131, SyncStart = 63786186001714, IssueDrawCommandsStart = 63786186665777, SwapBuffers = 63786221115256, FrameCompleted = 63786224180881, DequeueBufferDuration = 428000, QueueBufferDuration = 290000
  • 2020-03-03 21: 25: 22.192 31096-31096 / com.elfeI jank_removeInvalidNode список джанков равен нулю

И есть пользовательские представления:

RecyclerView

open class TimeRecyclerView(context: Context, attrs: AttributeSet?) : RecyclerView(context, attrs) {
    val time = mutableListOf<String>()

    var position = 0

    var isTouchable = true
    var isScrolling = false

    init {
        layoutManager = LinearLayoutManager(context)
        adapter = TimeAdapter(context, time)
    }

    override fun onTouchEvent(e: MotionEvent?): Boolean {
        super.onTouchEvent(e)
        return isTouchable
    }

    fun onChange(action: () -> Unit = {}) {
        val layoutManager = this.layoutManager as LinearLayoutManager

        this.addOnScrollListener(object :
            RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)

                if (newState == 0 && !isScrolling) {
                    isScrolling = true

                    position = layoutManager.findLastVisibleItemPosition()

                    recyclerView.scrollToPosition(position)

                    action()

                    isScrolling = false
                }
            }
        })
    }
}

Часы (минуты работают одинаково, но с 59, а не с 23)

class Hours(context: Context, attributeSet: AttributeSet?) : TimeRecyclerView(context, attributeSet) {
    init {
        for (i in 0..23) {
            time.add(
                if (i < 10) "0$i" else  i.toString()
            )
        }
        adapter?.notifyDataSetChanged()
    }
}

ConstraintLayout

class Alarm(context: Context, attributeSet: AttributeSet): ConstraintLayout(context, attributeSet) {

    var hours: Hours
    private set
    var minutes: Minutes
    private set

    init {
        inflate(context, R.layout.alarm, this)

        hours = recyclerview_hours
        minutes = recyclerview_minutes

        hours.onChange()
        minutes.onChange()
    }

    fun disable() {
        hours.isTouchable = false
        minutes.isTouchable = false
    }
}

Вопрос прост: почему просмотр занимает так много времени?

Заранее спасибо за ваши знания!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...