Problem performing LayoutAnimation in RecyclerView when triggered by SwipeRefreshLayoutSwipeRefreshLayout trigger programmaticallyRecyclerView and SwipeRefreshLayoutHow to implement endless list with RecyclerView?SwipeRefreshLayout is hidden on empty RecyclerViewHow to animate RecyclerView items when they appearandroid CoordinatorLayout and SwipeRefreshLayout and RecyclerViewCorrect hierarchy for SlidingUpPanelLayout, SwipeRefreshLayout, and RecyclerViewRecyclerView inside SwipeRefreshLayout does not showRecyclerView in SwipeRefreshLayout not “wrap_content”SwipeRefreshLayout stops working / RecyclerView inconsistently triggers SwipeRefreshLayout
Leveraging cash for buying car
Catching a robber on one line
Lead the way to this Literary Knight to its final “DESTINATION”
2 Managed Packages in 1 Dev Org
Why is gun control associated with the socially liberal Democratic party?
How to prevent cables getting intertwined
How did space travel spread through the galaxy?
What could be the physiological mechanism for a biological Geiger counter?
How to write a nice frame challenge?
Why can't I craft scaffolding in Minecraft 1.14?
When is the phrase "j'ai bon" used?
How to ask if I can mow my neighbor's lawn
Having some issue with notation in a Hilbert space
How to know whether to write accidentals as sharps or flats?
How does the Linux command "mount -a" work?
Does knowing the surface area of all faces uniquely determine a tetrahedron?
On George Box, Galit Shmueli and the scientific method?
What kind of chart is this?
Would a 7805 5v regulator drain a 9v battery?
Is my research statement supposed to lead to papers in top journals?
What is the precise meaning of "подсел на мак"?
How to make a villain when your PCs are villains?
Basic power tool set for Home repair and simple projects
Leaving job close to major deadlines
Problem performing LayoutAnimation in RecyclerView when triggered by SwipeRefreshLayout
SwipeRefreshLayout trigger programmaticallyRecyclerView and SwipeRefreshLayoutHow to implement endless list with RecyclerView?SwipeRefreshLayout is hidden on empty RecyclerViewHow to animate RecyclerView items when they appearandroid CoordinatorLayout and SwipeRefreshLayout and RecyclerViewCorrect hierarchy for SlidingUpPanelLayout, SwipeRefreshLayout, and RecyclerViewRecyclerView inside SwipeRefreshLayout does not showRecyclerView in SwipeRefreshLayout not “wrap_content”SwipeRefreshLayout stops working / RecyclerView inconsistently triggers SwipeRefreshLayout
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I am trying to perform a custom animation in my RecyclerView using the XML property android:layoutAnimation
.
The problem is: When I populate my adapter directly in the activity's onCreate()
, the animation triggers normally. However, when I try to populate my recyclerView from the SwipeRefreshLayout.setOnRefreshListener
the animation is not triggered correctly.
I have no idea what is wrong.
Dependencies
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha04'
XML files
Activity XML:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/postListRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation_enter_up"
android:paddingTop="8dp"
android:paddingBottom="8dp" />
layout_animation_enter_up.xml:
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_enter_up"
android:animationOrder="normal"
android:delay="15%" />
item_animation_enter_up.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600">
<translate
android:fromYDelta="50%p"
android:interpolator="@android:anim/decelerate_interpolator"
android:toYDelta="0" />
<alpha
android:fromAlpha="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1" />
</set>
My Code in simplified version
This code triggers the layout_animation_enter_up animation correctly:
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_list)
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)
adapter.submitList(postList)
This code does not trigger the layout_animation_enter_up animation:
override fun onCreate(savedInstanceState: Bundle?)
postListSwipeRefreshLayout.setOnRefreshListener
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)
adapter.submitList(postList)
In both code snippets (that are basically the same), I am considering that the RecyclerView is going from an empty state to a populated state. Is there any difference on the UI perspective if I populate my adapter inside the setOnRefreshListener
callback or inside the onCreate
?
Edit: The snippets above are different from the original codebase just to make the explanation easier. I don't want to know about performance in this question. I would like to know why the animation does not work in the second snippet and works fine in the first snippet.
android android-layout android-recyclerview android-animation swiperefreshlayout
add a comment |
I am trying to perform a custom animation in my RecyclerView using the XML property android:layoutAnimation
.
The problem is: When I populate my adapter directly in the activity's onCreate()
, the animation triggers normally. However, when I try to populate my recyclerView from the SwipeRefreshLayout.setOnRefreshListener
the animation is not triggered correctly.
I have no idea what is wrong.
Dependencies
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha04'
XML files
Activity XML:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/postListRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation_enter_up"
android:paddingTop="8dp"
android:paddingBottom="8dp" />
layout_animation_enter_up.xml:
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_enter_up"
android:animationOrder="normal"
android:delay="15%" />
item_animation_enter_up.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600">
<translate
android:fromYDelta="50%p"
android:interpolator="@android:anim/decelerate_interpolator"
android:toYDelta="0" />
<alpha
android:fromAlpha="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1" />
</set>
My Code in simplified version
This code triggers the layout_animation_enter_up animation correctly:
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_list)
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)
adapter.submitList(postList)
This code does not trigger the layout_animation_enter_up animation:
override fun onCreate(savedInstanceState: Bundle?)
postListSwipeRefreshLayout.setOnRefreshListener
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)
adapter.submitList(postList)
In both code snippets (that are basically the same), I am considering that the RecyclerView is going from an empty state to a populated state. Is there any difference on the UI perspective if I populate my adapter inside the setOnRefreshListener
callback or inside the onCreate
?
Edit: The snippets above are different from the original codebase just to make the explanation easier. I don't want to know about performance in this question. I would like to know why the animation does not work in the second snippet and works fine in the first snippet.
android android-layout android-recyclerview android-animation swiperefreshlayout
add a comment |
I am trying to perform a custom animation in my RecyclerView using the XML property android:layoutAnimation
.
The problem is: When I populate my adapter directly in the activity's onCreate()
, the animation triggers normally. However, when I try to populate my recyclerView from the SwipeRefreshLayout.setOnRefreshListener
the animation is not triggered correctly.
I have no idea what is wrong.
Dependencies
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha04'
XML files
Activity XML:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/postListRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation_enter_up"
android:paddingTop="8dp"
android:paddingBottom="8dp" />
layout_animation_enter_up.xml:
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_enter_up"
android:animationOrder="normal"
android:delay="15%" />
item_animation_enter_up.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600">
<translate
android:fromYDelta="50%p"
android:interpolator="@android:anim/decelerate_interpolator"
android:toYDelta="0" />
<alpha
android:fromAlpha="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1" />
</set>
My Code in simplified version
This code triggers the layout_animation_enter_up animation correctly:
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_list)
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)
adapter.submitList(postList)
This code does not trigger the layout_animation_enter_up animation:
override fun onCreate(savedInstanceState: Bundle?)
postListSwipeRefreshLayout.setOnRefreshListener
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)
adapter.submitList(postList)
In both code snippets (that are basically the same), I am considering that the RecyclerView is going from an empty state to a populated state. Is there any difference on the UI perspective if I populate my adapter inside the setOnRefreshListener
callback or inside the onCreate
?
Edit: The snippets above are different from the original codebase just to make the explanation easier. I don't want to know about performance in this question. I would like to know why the animation does not work in the second snippet and works fine in the first snippet.
android android-layout android-recyclerview android-animation swiperefreshlayout
I am trying to perform a custom animation in my RecyclerView using the XML property android:layoutAnimation
.
The problem is: When I populate my adapter directly in the activity's onCreate()
, the animation triggers normally. However, when I try to populate my recyclerView from the SwipeRefreshLayout.setOnRefreshListener
the animation is not triggered correctly.
I have no idea what is wrong.
Dependencies
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha04'
XML files
Activity XML:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/postListRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation_enter_up"
android:paddingTop="8dp"
android:paddingBottom="8dp" />
layout_animation_enter_up.xml:
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_enter_up"
android:animationOrder="normal"
android:delay="15%" />
item_animation_enter_up.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600">
<translate
android:fromYDelta="50%p"
android:interpolator="@android:anim/decelerate_interpolator"
android:toYDelta="0" />
<alpha
android:fromAlpha="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1" />
</set>
My Code in simplified version
This code triggers the layout_animation_enter_up animation correctly:
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_list)
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)
adapter.submitList(postList)
This code does not trigger the layout_animation_enter_up animation:
override fun onCreate(savedInstanceState: Bundle?)
postListSwipeRefreshLayout.setOnRefreshListener
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)
adapter.submitList(postList)
In both code snippets (that are basically the same), I am considering that the RecyclerView is going from an empty state to a populated state. Is there any difference on the UI perspective if I populate my adapter inside the setOnRefreshListener
callback or inside the onCreate
?
Edit: The snippets above are different from the original codebase just to make the explanation easier. I don't want to know about performance in this question. I would like to know why the animation does not work in the second snippet and works fine in the first snippet.
android android-layout android-recyclerview android-animation swiperefreshlayout
android android-layout android-recyclerview android-animation swiperefreshlayout
edited Mar 25 at 12:31
Phellipe Silva
asked Mar 25 at 4:11
Phellipe SilvaPhellipe Silva
215
215
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Basically the first snippet only should work if you submit your list inside refresh, i.e:
postListSwipeRefreshLayout.setOnRefreshListener
adapter.submitList(postList)
And the second snippet of code should not trigger animation, because every time you refresh layout you create a new adapter instance which make the adapter can't observer the changes.
I don't know why you're creating a new instance every time you refresh your layout, however this consuming memory with useless instances.
In Summary: You should create instances one time only, and reuse it as much as you can instead of creating new one.
Hi Ibrahim, thanks for your response. The snippets above are different from the original codebase just to make the explanation easier (I added this info in my post). My intention here is to understand why the animation works in the first snippet and not in the second, considering that the RecyclerView is going from an empty state to a populated state in both cases. I have tried using one instance of the adapter and I still have the same problem =(
– Phellipe Silva
Mar 25 at 12:11
@PhellipeSilva Well, I think there is no much more potentials here, you're creating new adapter and setting new adapter instance to recycleView which produce non-animation behavior. And by submitting list only inonRefresh
should work if you have submitted different lists items.
– Ibrahim Ali
Mar 25 at 12:38
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55331165%2fproblem-performing-layoutanimation-in-recyclerview-when-triggered-by-swiperefres%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Basically the first snippet only should work if you submit your list inside refresh, i.e:
postListSwipeRefreshLayout.setOnRefreshListener
adapter.submitList(postList)
And the second snippet of code should not trigger animation, because every time you refresh layout you create a new adapter instance which make the adapter can't observer the changes.
I don't know why you're creating a new instance every time you refresh your layout, however this consuming memory with useless instances.
In Summary: You should create instances one time only, and reuse it as much as you can instead of creating new one.
Hi Ibrahim, thanks for your response. The snippets above are different from the original codebase just to make the explanation easier (I added this info in my post). My intention here is to understand why the animation works in the first snippet and not in the second, considering that the RecyclerView is going from an empty state to a populated state in both cases. I have tried using one instance of the adapter and I still have the same problem =(
– Phellipe Silva
Mar 25 at 12:11
@PhellipeSilva Well, I think there is no much more potentials here, you're creating new adapter and setting new adapter instance to recycleView which produce non-animation behavior. And by submitting list only inonRefresh
should work if you have submitted different lists items.
– Ibrahim Ali
Mar 25 at 12:38
add a comment |
Basically the first snippet only should work if you submit your list inside refresh, i.e:
postListSwipeRefreshLayout.setOnRefreshListener
adapter.submitList(postList)
And the second snippet of code should not trigger animation, because every time you refresh layout you create a new adapter instance which make the adapter can't observer the changes.
I don't know why you're creating a new instance every time you refresh your layout, however this consuming memory with useless instances.
In Summary: You should create instances one time only, and reuse it as much as you can instead of creating new one.
Hi Ibrahim, thanks for your response. The snippets above are different from the original codebase just to make the explanation easier (I added this info in my post). My intention here is to understand why the animation works in the first snippet and not in the second, considering that the RecyclerView is going from an empty state to a populated state in both cases. I have tried using one instance of the adapter and I still have the same problem =(
– Phellipe Silva
Mar 25 at 12:11
@PhellipeSilva Well, I think there is no much more potentials here, you're creating new adapter and setting new adapter instance to recycleView which produce non-animation behavior. And by submitting list only inonRefresh
should work if you have submitted different lists items.
– Ibrahim Ali
Mar 25 at 12:38
add a comment |
Basically the first snippet only should work if you submit your list inside refresh, i.e:
postListSwipeRefreshLayout.setOnRefreshListener
adapter.submitList(postList)
And the second snippet of code should not trigger animation, because every time you refresh layout you create a new adapter instance which make the adapter can't observer the changes.
I don't know why you're creating a new instance every time you refresh your layout, however this consuming memory with useless instances.
In Summary: You should create instances one time only, and reuse it as much as you can instead of creating new one.
Basically the first snippet only should work if you submit your list inside refresh, i.e:
postListSwipeRefreshLayout.setOnRefreshListener
adapter.submitList(postList)
And the second snippet of code should not trigger animation, because every time you refresh layout you create a new adapter instance which make the adapter can't observer the changes.
I don't know why you're creating a new instance every time you refresh your layout, however this consuming memory with useless instances.
In Summary: You should create instances one time only, and reuse it as much as you can instead of creating new one.
answered Mar 25 at 4:35
Ibrahim AliIbrahim Ali
143112
143112
Hi Ibrahim, thanks for your response. The snippets above are different from the original codebase just to make the explanation easier (I added this info in my post). My intention here is to understand why the animation works in the first snippet and not in the second, considering that the RecyclerView is going from an empty state to a populated state in both cases. I have tried using one instance of the adapter and I still have the same problem =(
– Phellipe Silva
Mar 25 at 12:11
@PhellipeSilva Well, I think there is no much more potentials here, you're creating new adapter and setting new adapter instance to recycleView which produce non-animation behavior. And by submitting list only inonRefresh
should work if you have submitted different lists items.
– Ibrahim Ali
Mar 25 at 12:38
add a comment |
Hi Ibrahim, thanks for your response. The snippets above are different from the original codebase just to make the explanation easier (I added this info in my post). My intention here is to understand why the animation works in the first snippet and not in the second, considering that the RecyclerView is going from an empty state to a populated state in both cases. I have tried using one instance of the adapter and I still have the same problem =(
– Phellipe Silva
Mar 25 at 12:11
@PhellipeSilva Well, I think there is no much more potentials here, you're creating new adapter and setting new adapter instance to recycleView which produce non-animation behavior. And by submitting list only inonRefresh
should work if you have submitted different lists items.
– Ibrahim Ali
Mar 25 at 12:38
Hi Ibrahim, thanks for your response. The snippets above are different from the original codebase just to make the explanation easier (I added this info in my post). My intention here is to understand why the animation works in the first snippet and not in the second, considering that the RecyclerView is going from an empty state to a populated state in both cases. I have tried using one instance of the adapter and I still have the same problem =(
– Phellipe Silva
Mar 25 at 12:11
Hi Ibrahim, thanks for your response. The snippets above are different from the original codebase just to make the explanation easier (I added this info in my post). My intention here is to understand why the animation works in the first snippet and not in the second, considering that the RecyclerView is going from an empty state to a populated state in both cases. I have tried using one instance of the adapter and I still have the same problem =(
– Phellipe Silva
Mar 25 at 12:11
@PhellipeSilva Well, I think there is no much more potentials here, you're creating new adapter and setting new adapter instance to recycleView which produce non-animation behavior. And by submitting list only in
onRefresh
should work if you have submitted different lists items.– Ibrahim Ali
Mar 25 at 12:38
@PhellipeSilva Well, I think there is no much more potentials here, you're creating new adapter and setting new adapter instance to recycleView which produce non-animation behavior. And by submitting list only in
onRefresh
should work if you have submitted different lists items.– Ibrahim Ali
Mar 25 at 12:38
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55331165%2fproblem-performing-layoutanimation-in-recyclerview-when-triggered-by-swiperefres%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown