适用约束集后TextViews位置折叠

时间:2018-01-22 16:56:38

标签: android layout android-constraintlayout

我有循环,它定位存储在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。

1 个答案:

答案 0 :(得分:0)

您正在从LayoutParams获取decoy并将其应用于其他视图,以便您的所有视图共享相同的集合,因此更改一个会导致所有视图中的更改。

要更正此问题,请复制LayoutParams并按如下方式应用副本:

newone.setLayoutParams(new ConstraintLayout.LayoutParams(decoy.getLayoutParams()));

这样,您的每个视图都会获得自己的LayoutParams