Привязка объектов через ConstraintSet

Не совсем понимаю, как работает ConstraintSet. Суть кода такова, что генерируется один constraintLayout и его верх нужно привязать к toolbar, а низ к низу основного ConstrantLayout. (id: Основной ConstraintLayout - R.id.constraint Второй ConstraintLayout генерируется через код Toolbar - R.id.toolbar) Картинка с привязкой и генерацией Constrain'a ниже код


import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.ExpandableListView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    int lastConstraintLayout;//Каждый раз меняется в "displayOneParcelHistory", чтобы последующий раз, эжемент присоединялся к предыдущему
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(view -> displayAllParcelsHistory(getTrackNumbersFromStorage()));
        lastConstraintLayout = findViewById(R.id.toolbar).getId();
    }
    private void displayAllParcelsHistory(String[] trackNumbers){
        for (String trackNumber:trackNumbers) {
            displayOneParcelHistory(trackNumber);
        }

    }


    @SuppressLint("ResourceType")
    private void displayOneParcelHistory(String trackNumber){
        String groupName = trackNumber;
        ArrayList<String> listItems = getParcelHistoryData(trackNumber); //0-Событие, 1-Дата, 2-Индекс, 3-Место
        //Настройка нового констрейна
        ConstraintLayout constraintLayout = new ConstraintLayout(this);
        ConstraintLayout.LayoutParams constraintParams = new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        constraintLayout.setId(R.integer.test_id);
        this.addContentView(constraintLayout, constraintParams);
        constraintLayout.setBackgroundResource(R.drawable.post_plank_shape);
        constraintLayout.setMaxHeight(dpTotp(400));

        //Настройка списка
        ViewGroup.LayoutParams expandableListParams = new ViewGroup.LayoutParams(dpTotp(325), ViewGroup.LayoutParams.WRAP_CONTENT);
        ConstraintSet expandableListSet = new ConstraintSet();
        ExpandableListView listView = new ExpandableListView(this);
        constraintLayout.addView(listView, expandableListParams);

        //настройка привязок
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clear(R.id.button, ConstraintSet.TOP);
        constraintSet.clear(R.id.button, ConstraintSet.BOTTOM);
        constraintSet.connect(R.id.button, ConstraintSet.TOP, R.id.toolbar, ConstraintSet.BOTTOM, 10);
        constraintSet.connect(R.id.button, ConstraintSet.BOTTOM, R.id.constraint, ConstraintSet.BOTTOM, 10);
        constraintSet.applyTo(findViewById(R.id.constraint));

//        MainAdapter adapter = new MainAdapter(groupName, listItems);
//        listView.setAdapter(adapter);
    }

    @SuppressLint("SetTextI18n")
    private ArrayList<String> getParcelHistoryData (String trackNumber){ //Возвращает необходимые данные
        //Получение данных от апи
        Parsing parsing = new Parsing();
        String apiResponse = parsing.GetParcelHistory(trackNumber);
        JsonHandler.JsonPattern pattern = JsonHandler.GetJsonHistory(apiResponse);

        ArrayList<String> events = new ArrayList<>();
        for (JsonHandler.Event event:pattern.data.events) {
            //Добавили данные
            events.add(String.format("%s\n %s, %s, %s",
                    event.operationAttribute, event.operationDateTime, event.operationPlacePostalCode, event.operationPlaceNameTranslated));
        }
        return events;
    }


    //Доделать
    private String[] getTrackNumbersFromStorage(){
        String[] trackNumbers = new String[]{"80513370548691"};//, "RD105843655MN"};
        return trackNumbers;
    }
    private int dpTotp(int dp){
        return Math.round(dp * this.getResources().getDisplayMetrics().density);
    }
}```
![привязка](https://sun1.ufanet-orenburg.userapi.com/s/v1/ig2/qWXuZQ36A1_XyJDK_hjfRIIkWcSCXa3TMJE5CuGGtGf7vk6pOaBOpSAKJ6i_MGhI-1nRWvhGHKlErXra2Nx5U2f5.jpg?size=275x491&quality=96&type=album)
![Генерация](https://sun9-west.userapi.com/sun9-39/s/v1/ig2/PcG8BuuqpM7IPswC4Ua2mK77ODjO6gdgosSB1saOiE7cjgyaUnYGt-mUfc80WKlUTH6W3dpKKhwdJX1CjOlOg7h7.jpg?size=1392x166&quality=96&type=album)

Ответы (0 шт):