Skip to content
This repository was archived by the owner on Dec 27, 2024. It is now read-only.

Commit 932a96d

Browse files
authored
demo a horizontal and vertical recycler view (#758)
1 parent 66dc7fb commit 932a96d

File tree

6 files changed

+280
-17
lines changed

6 files changed

+280
-17
lines changed

demoProjects/ExamplesComposeConstraintLayout/.idea/deploymentTargetDropDown.xml

Lines changed: 0 additions & 17 deletions
This file was deleted.

demoProjects/ExamplesRecyclerView/app/src/main/AndroidManifest.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@
1717
<category android:name="android.intent.category.LAUNCHER" />
1818
</intent-filter>
1919
</activity>
20+
<activity android:name="com.example.motionrecycle.TwoRecycler"
21+
android:exported="true">
22+
<intent-filter>
23+
<action android:name="android.intent.action.MAIN" />
24+
<category android:name="android.intent.category.LAUNCHER" />
25+
</intent-filter>
26+
</activity>
27+
2028
<activity android:name="com.example.motionrecycle.BinaryLights"
2129
android:exported="true">
2230
<intent-filter>
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.example.motionrecycle;
2+
3+
import android.os.Bundle;
4+
import android.os.Handler;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.Button;
9+
10+
import androidx.annotation.NonNull;
11+
import androidx.appcompat.app.AppCompatActivity;
12+
import androidx.constraintlayout.motion.widget.MotionLayout;
13+
import androidx.constraintlayout.motion.widget.TransitionAdapter;
14+
import androidx.constraintlayout.utils.widget.MotionLabel;
15+
import androidx.recyclerview.widget.LinearLayoutManager;
16+
import androidx.recyclerview.widget.RecyclerView;
17+
18+
public class TwoRecycler extends AppCompatActivity {
19+
MotionLayout motionLayout;
20+
21+
@Override
22+
protected void onCreate(Bundle savedInstanceState) {
23+
super.onCreate(savedInstanceState);
24+
setContentView(R.layout.recycler_two);
25+
setTitle("Collapsing Horizontal & Vertical RecyclerView");
26+
motionLayout = findViewById(R.id.motion_layout_container);
27+
RecyclerView recyclerView = findViewById(R.id.recycler_view_vertical);
28+
configure(recyclerView, false);
29+
recyclerView = findViewById(R.id.recycler_view_horizontal_view);
30+
configure(recyclerView, true);
31+
}
32+
33+
public void configure(RecyclerView rv, boolean horizontal) {
34+
rv.setAdapter( new RecyclerView.Adapter<SimpleViewHolder>() {
35+
final int type = (horizontal) ? R.layout.row_item_horizontal : R.layout.lock_recycler_item;
36+
37+
@NonNull
38+
@Override
39+
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
40+
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
41+
View view = inflater.inflate(type, parent, false);
42+
return new SimpleViewHolder(view, rv);
43+
}
44+
45+
@Override
46+
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position) {
47+
if (horizontal)
48+
((MotionLabel) (holder.label)).setText("Group " + position);
49+
else
50+
((Button) (holder.label)).setText("item " + position);
51+
}
52+
53+
@Override
54+
public int getItemCount() {
55+
return 200;
56+
}
57+
});
58+
59+
rv.setLayoutManager(new LinearLayoutManager(this,
60+
(horizontal) ? RecyclerView.HORIZONTAL : RecyclerView.VERTICAL, false));
61+
}
62+
63+
static class SimpleViewHolder extends RecyclerView.ViewHolder {
64+
View label;
65+
RecyclerView mRecyclerView;
66+
TransitionAdapter adapter = new TransitionAdapter() {
67+
@Override
68+
public void onTransitionStarted(MotionLayout motionLayout, int startId, int endId) {
69+
mRecyclerView.suppressLayout(true);
70+
}
71+
72+
@Override
73+
public void onTransitionCompleted(MotionLayout motionLayout, int currentId) {
74+
mRecyclerView.suppressLayout(false);
75+
}
76+
};
77+
78+
public SimpleViewHolder(View itemView, RecyclerView recyclerView) {
79+
super(itemView);
80+
mRecyclerView = recyclerView;
81+
label = itemView.findViewById(R.id.button);
82+
if (itemView instanceof MotionLayout) {
83+
((MotionLayout) itemView).setTransitionListener(adapter);
84+
}
85+
}
86+
}
87+
}
88+
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
5+
xmlns:tools="http://schemas.android.com/tools"
6+
android:id="@+id/motion_layout_container"
7+
android:layout_width="match_parent"
8+
android:layout_height="match_parent"
9+
android:layout_marginVertical="16dp"
10+
app:layoutDescription="@xml/recycle_two_scene"
11+
tools:context=".MainActivity">
12+
13+
<TextView
14+
android:id="@+id/horizontal_title_text_view"
15+
android:layout_width="0dp"
16+
android:layout_height="wrap_content"
17+
android:text="Horizontal RecyclerView"
18+
android:textAlignment="center"
19+
android:textSize="20sp" />
20+
21+
<androidx.core.widget.NestedScrollView
22+
android:id="@+id/recycler_view_horizontal"
23+
android:layout_width="0dp"
24+
android:layout_height="wrap_content"
25+
app:layout_constraintTop_toBottomOf="@+id/horizontal_title_text_view"
26+
app:layout_constraintStart_toStartOf="parent"
27+
app:layout_constraintEnd_toEndOf="parent"
28+
android:orientation="vertical">
29+
30+
<androidx.recyclerview.widget.RecyclerView
31+
android:id="@+id/recycler_view_horizontal_view"
32+
android:layout_width="match_parent"
33+
android:layout_height="wrap_content"
34+
tools:itemCount="1"
35+
tools:listitem="@layout/row_single_item_horizontal" />
36+
</androidx.core.widget.NestedScrollView>
37+
<TextView
38+
android:id="@+id/vertical_title_text_view"
39+
android:layout_width="0dp"
40+
android:layout_height="wrap_content"
41+
android:text="Vertical RecyclerView"
42+
android:textAlignment="center"
43+
android:textSize="20sp" />
44+
45+
<androidx.recyclerview.widget.RecyclerView
46+
android:id="@+id/recycler_view_vertical"
47+
android:layout_width="0dp"
48+
android:layout_height="0dp"
49+
tools:itemCount="10"
50+
tools:listitem="@layout/row_single_item" />
51+
</androidx.constraintlayout.motion.widget.MotionLayout>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
5+
android:layout_width="200dp"
6+
android:layout_height="100dp">
7+
8+
<androidx.constraintlayout.utils.widget.MotionLabel
9+
android:id="@+id/base"
10+
android:layout_width="0dp"
11+
android:layout_height="0dp"
12+
android:layout_margin="8dp"
13+
android:background="#125127"
14+
app:borderRound="4sp"
15+
android:text="Horizontal"
16+
android:textColor="#A9DFAA"
17+
app:textPanY="0.9"
18+
19+
app:layout_constraintBottom_toBottomOf="parent"
20+
app:layout_constraintEnd_toEndOf="parent"
21+
app:layout_constraintStart_toStartOf="parent"
22+
app:layout_constraintTop_toTopOf="parent" />
23+
24+
<androidx.constraintlayout.utils.widget.MotionLabel
25+
android:id="@+id/button"
26+
android:layout_width="0dp"
27+
android:layout_height="0dp"
28+
android:layout_marginTop="32dp"
29+
android:layout_marginBottom="-16dp"
30+
android:text="Horizontal item."
31+
android:textColor="#EBFFEB"
32+
android:background="#4E5C4C"
33+
app:borderRound="16sp"
34+
app:layout_constraintBottom_toBottomOf="@+id/base"
35+
app:layout_constraintEnd_toEndOf="@+id/base"
36+
app:layout_constraintStart_toStartOf="@+id/base"
37+
app:layout_constraintTop_toTopOf="@+id/base" />
38+
39+
</androidx.constraintlayout.widget.ConstraintLayout>
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<MotionScene
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
5+
xmlns:motion="http://schemas.android.com/apk/res-auto">
6+
7+
<ConstraintSet android:id="@+id/start">
8+
9+
<Constraint
10+
android:id="@id/horizontal_title_text_view"
11+
android:layout_width="0dp"
12+
android:layout_height="wrap_content"
13+
motion:layout_constraintTop_toTopOf="parent"
14+
motion:layout_constraintStart_toStartOf="parent"
15+
motion:layout_constraintEnd_toEndOf="parent"
16+
/>
17+
18+
<Constraint
19+
android:id="@id/recycler_view_horizontal"
20+
android:layout_width="0dp"
21+
android:layout_height="wrap_content"
22+
motion:layout_constraintEnd_toEndOf="parent"
23+
motion:layout_constraintStart_toStartOf="parent"
24+
motion:layout_constraintTop_toBottomOf="@id/horizontal_title_text_view" />
25+
26+
<Constraint
27+
android:id="@id/vertical_title_text_view"
28+
android:layout_width="0dp"
29+
android:layout_height="wrap_content"
30+
motion:layout_constraintEnd_toEndOf="parent"
31+
motion:layout_constraintStart_toStartOf="parent"
32+
motion:layout_constraintTop_toBottomOf="@id/recycler_view_horizontal"
33+
/>
34+
35+
<Constraint
36+
android:id="@id/recycler_view_vertical"
37+
android:layout_width="0dp"
38+
android:layout_height="0dp"
39+
motion:layout_constraintBottom_toBottomOf="parent"
40+
motion:layout_constraintEnd_toEndOf="parent"
41+
motion:layout_constraintStart_toStartOf="parent"
42+
motion:layout_constraintTop_toBottomOf="@id/vertical_title_text_view" />
43+
</ConstraintSet>
44+
45+
<ConstraintSet android:id="@+id/end">
46+
<Constraint
47+
android:id="@id/horizontal_title_text_view"
48+
android:layout_width="0dp"
49+
android:layout_height="wrap_content"
50+
motion:layout_constraintTop_toTopOf="parent"
51+
motion:layout_constraintStart_toStartOf="parent"
52+
motion:layout_constraintEnd_toEndOf="parent"
53+
android:visibility="invisible"
54+
/>
55+
56+
<Constraint
57+
android:id="@id/recycler_view_horizontal"
58+
motion:layout_constraintBottom_toTopOf="parent"
59+
motion:layout_constraintEnd_toEndOf="parent"
60+
motion:layout_constraintStart_toStartOf="parent"
61+
android:visibility="invisible"
62+
/>
63+
64+
<Constraint
65+
android:id="@id/vertical_title_text_view"
66+
android:layout_width="0dp"
67+
android:layout_height="wrap_content"
68+
motion:layout_constraintEnd_toEndOf="parent"
69+
motion:layout_constraintStart_toStartOf="parent"
70+
motion:layout_constraintTop_toTopOf="parent" />
71+
72+
<Constraint
73+
android:id="@id/recycler_view_vertical"
74+
android:layout_width="0dp"
75+
android:layout_height="0dp"
76+
motion:layout_constraintBottom_toBottomOf="parent"
77+
motion:layout_constraintEnd_toEndOf="parent"
78+
motion:layout_constraintStart_toStartOf="parent"
79+
motion:layout_constraintTop_toBottomOf="@id/vertical_title_text_view" />
80+
</ConstraintSet>
81+
82+
<Transition
83+
motion:duration="1000"
84+
motion:layoutDuringTransition="honorRequest"
85+
motion:constraintSetEnd="@+id/end"
86+
motion:constraintSetStart="@+id/start">
87+
88+
<OnSwipe
89+
motion:dragScale=".25"
90+
motion:touchAnchorId="@id/recycler_view_vertical"
91+
motion:dragDirection="dragUp"
92+
motion:onTouchUp="stop" />
93+
</Transition>
94+
</MotionScene>

0 commit comments

Comments
 (0)