Порядок инициализации родительского и дочернего классов Kotlin - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть представление SubEpoxyRecyclerView, которое является подклассом EpoxyRecyclerView, моего родительского класса.Когда это представление инициализируется, суперкласс EpoxyRecyclerView вызывает метод setItemSpacingPx(Int) в теле конструктора.

Когда вызывается этот метод, ни одна из моих переменных класса не инициализируется!Приложение вылетает на линии itemDecorator.pxBetweenItems, заявляя, что itemDecorator является нулем, что невозможно

Подкласс (Kotlin):

class SubEpoxyRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
    : EpoxyRecyclerView(context, attrs, defStyleAttr) {

    private val itemDecorator: Decor = Decor()
    private val someInt: Int = 5
    private var someBoolean: Boolean = true

    override fun setItemSpacingPx(spacingPx: Int) {
        // Called from superclass. Debug: itemDecorator is null, 
        // someInt is 0, someBoolean is false

        removeItemDecoration(itemDecorator)
        itemDecorator.pxBetweenItems = spacingPx

        if (spacingPx > 0) {
            addItemDecoration(itemDecorator)
        }
    }
}

Суперкласс (Java - библиотека):

public class EpoxyRecyclerView extends RecyclerView {
  public EpoxyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    if (attrs != null) {
      TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EpoxyRecyclerView,
          defStyleAttr, 0);
      setItemSpacingPx(a.getDimensionPixelSize(R.styleable.EpoxyRecyclerView_itemSpacing, 0));
      a.recycle();
    }

    init();
  }
}

1 Ответ

0 голосов
/ 01 февраля 2019

Это довольно нормально.Порядок инициализации:

  1. Родительский класс
  2. Дочерний класс

Посмотрите на этот пример, чтобы понять, почему ваш код не работает:

open class Parent {
  init { print("parent ") } 
}

class Child : Parent() {
  init { print("child ") } 
}

fun main(args: Array<String>) {
  Child() 
}

Согласно приведенному выше примеру, метод main печатает сначала «parent», затем печатает «child».В вашем случае переменные класса SubEpoxyRecyclerView не инициализируются, поскольку сам класс инициализируется после завершения инициализации EpoxyRecyclerView.

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