У меня есть ConstraintLayout, в котором у меня есть View (называемый Bar) и RecyclerView, привязанный к нижней части панели, RecyclerView имеет высоту, установленную для соответствия Constraint (0dp),
Так что если в редакторе макетов Android я перемещаюсь вверх, например, на панель, высота RecyclerView увеличивается и всегда «привязывается» к панели, это работает,
Но это не то же самое поведение во время выполнения, когда я перемещаю панель (с помощью onTouchListener), высота RecyclerView вообще не изменяется и остается такой же, как если бы панель была в той же позиции.
Чтобы достичь этого поведения (переместите панель, увеличьте / уменьшите высоту RecyclerView), я подумал и попытался найти решение ConstraintLayout,
Итак, я установил ограничение (Top) для нижней части бара и установил высоту, соответствующую ограничению,
Я также пытался добиться такого поведения с помощью LayoutParam, меняя высоту на основе перемещенных пикселей, но формула не на 100% хороша и используя этот способ, изменяю высоту как снизу, так и сверху вида (видимо, не с Ограничительное решение)
<ConstraintLayout>
...
<!-- Removed all Constraint to the Bar to let it freely move on Touch on it's Y Axis, also tried to constraint start, end, top to the parent, but same behavior -->
<include layout="@layout/theBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/theBarWhoMove"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerViewConstrainedToTheBar"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="2dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="2dp"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="2dp"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/theBarWhoMove"/>
...
</ConstraintLayout>
barWhoMove.setOnTouchListener { v, event ->
when(event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
barWhoMoveDY = v.y - event.rawY
return@setOnTouchListener true
}
MotionEvent.ACTION_MOVE -> {
////We move the Bar
v.animate().translationY(barWhoMoveDY +
event.rawY).setDuration(0).start()
/* To try to relayout and resize based on match Constrain taking in consideration the new barWhoMove position*/
recyclerViewConstrainedToTheBar.invalidate()
recyclerViewConstrainedToTheBar.requestLayout()
recyclerViewConstrainedToTheBar.forceLayout()
////Tried Also
constraintSet.constrainHeight(recyclerViewConstrainedToTheBar.id,
ConstraintSet.MATCH_CONSTRAINT)
constraintSet.applyTo(rootConstraintLayout)
////Tried Also
rootConstraintLayout.invalidate()
rootConstraintLayout.requestLayout()
rootConstraintLayout.forceLayout()
if(v.y < oldDY) {
/*#Solution 2 increase with LayoutParam but The formula is not 100% correct and it change height from both bottom and top, When View is moving Up or Down(it's work for detecting this)*/
....
oldDy = v.y
}
else {
....
oldDy = v.y
}
return@setOnTouchListener true
}
MotionEvent.ACTION_UP -> {
}
}
return@setOnTouchListener false
}
Редактировать:
Содержимое тега <include>
в макете 1:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/fragment_layout_main">
<data>
<variable name="variable" type="com.demo.ourClass" />
</data>
<android.support.v7.widget.CardView
android:id="@+id/card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textViewTitle"
android:layout_marginTop="8dp"
app:cardElevation="6dp">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher_round"
android:id="@+id/imageViewA"
android:layout_marginTop="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp"/>
<TextView
android:text="@{variable.name}"
tools:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Light.SearchResult.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textViewA"
app:layout_constraintStart_toEndOf="@+id/imageViewA"
app:layout_constraintBottom_toBottomOf="@id/imageViewA"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</android.support.v7.widget.CardView>