我有循环,它定位存储在ArrayList中的TextViews。 List以一个基本的TextView开始,它已经有了它的位置,而foreach循环将所有其他的设置在前一个下面。
for(int i = 1; i<textViewsArray.size(); i++){
TextView newone = textViewsArray.get(i);
newone.setLayoutParams(decoy.getLayoutParams());
constraintLayout.addView(newone);
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(constraintLayout);
constraintSet.connect(newone.getId(), ConstraintSet.TOP, textViewsArray.get(i-1).getId(), ConstraintSet.BOTTOM);
constraintSet.connect(newone.getId(), ConstraintSet.LEFT, R.id.guideline1, ConstraintSet.LEFT);
constraintSet.connect(newone.getId(), ConstraintSet.RIGHT, R.id.guideline2, ConstraintSet.LEFT);
constraintSet.constrainDefaultHeight(newone.getId(), ConstraintSet.WRAP_CONTENT);
constraintSet.applyTo(constraintLayout);
}
当数组执行一次时它可以工作,所以当它在基本数据下只定位一个额外的TextView时。但是当它进行更多迭代时,所有TextView都会粘在父视图的顶部,即Constraint Layout。
答案 0 :(得分:0)
您正在从LayoutParams
获取decoy
并将其应用于其他视图,以便您的所有视图共享相同的集合,因此更改一个会导致所有视图中的更改。
要更正此问题,请复制LayoutParams
并按如下方式应用副本:
newone.setLayoutParams(new ConstraintLayout.LayoutParams(decoy.getLayoutParams()));
这样,您的每个视图都会获得自己的LayoutParams
。