Android RelativeLayout: Показать список ConstraintLayouts - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть файл ConstraintLayout с именем R.layout.new_plan, который содержит представления, необходимые для отображения объекта PlanItem.Я хотел бы отобразить список R.layout.new_plan в представлении RelativeLayout root.

Мой RelativeLayout parent / root выглядит так:

<RelativeLayout
        android:id="@+id/rl_plan_items"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        <!-- other properties here -->
</RelativeLayout>

Другими словами, у меня есть List<PlanItem>, и я хотел бы отобразить этот список, используя представление R.layout.new_plan для отображения каждого PlanItem в rl_plan_items.Мой текущий способ сделать это - выполнить цикл для каждого PlanItem в списке, установить TextView s в R.layout.new_plan в соответствии с атрибутами текущего PlanItem и добавить его к rl_plan_items, используя каким-либо образом RelativeLayout.LayoutParams.

Код выглядит так:

private fun PlanItem.addToRootView(rootView: RelativeLayout, pos: Int) {
    val planItemView: ConstraintLayout = inflater
        .inflate(R.layout.new_plan, rootView, false) as ConstraintLayout

    planItemView.id = pos

    with(planItemView) {
        tv_title.text = name
        tv_desc.setTextAndGoneIfEmpty(description)
        tv_date.text = getDateToDisplay(resources)
        tv_subject.setTextAndGoneIfEmpty(subject?.name)
    }

    val params = planItemView.layoutParams as RelativeLayout.LayoutParams

    val idOfBelow: Int = if (pos > 0) planItemView.id - 1 else rootView.id
    params.addRule(RelativeLayout.BELOW, idOfBelow)

    rootView.addView(planItemView, params)
}

в моем фрагменте:

for (i in planItems.indices) {
    planItems[i].addToRootView(rl_plan_items, i)
}

Это показывает все PlanItems, но они отображаются друг на друге, не опускаясь на дно.

enter image description here

enter image description here

Как отобразить планпросмотр элементов по порядку идет вниз, а не хрустит вместе?

1 Ответ

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

Главное, что мне нужно было сделать, - установить planItemView id на идентификатор, который никогда не использовался в моем приложении.поэтому я создал числовую константу, которая вряд ли будет использоваться другими представлениями, и использую ее в качестве основы для представления элементов плана 2-го, 3-го, 4-го и т. д.

После этого отображается корень RelativeLayoutчеловек plan item view правильно.

  1. добавить к началу класса

    companion object {
        private const val BASE_PLAN_ITEM_ID = 164
    }
    
  2. Метод обновления

    private fun PlanItem.addToRootView(
        rootView: RelativeLayout,
        pos: Int,
        r: Resources
    ) {
        val planItemView: ConstraintLayout = inflater
            .inflate(R.layout.new_plan, rootView, false) as ConstraintLayout
    
        planItemView.id = BASE_PLAN_ITEM_ID + pos
    
        with(planItemView) {
            tv_title.text = name
            tv_desc.setTextAndGoneIfEmpty(description)
            tv_date.text = getDateToDisplay(resources)
            tv_subject.setTextAndGoneIfEmpty(subject?.name)
        }
    
        val params = planItemView.layoutParams as RelativeLayout.LayoutParams
    
        val idOfBelow: Int
    
        if (planItemView.id > BASE_PLAN_ITEM_ID) {
            idOfBelow = planItemView.id - 1
    
            // If it is the 2nd or more item in the list, add a margin above it
            params.setMargins(
                params.leftMargin,
                calculatePx(16, r),
                params.rightMargin,
                params.bottomMargin
            )
        } else {
            idOfBelow = rootView.id
        }
        params.addRule(RelativeLayout.BELOW, idOfBelow)
    
        rootView.addView(planItemView, params)
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...