Inside my fragment I'm setting my GridLayout in the following way:
mRecycler.setLayoutManager(new GridLayoutManager(rootView.getContext(), 2));
So, I just want to change that 2
for a 4
when the user rotates the phone/tablet. I've read about onConfigurationChanged
and I tried to make it work for my case, but it isn't going in the right way. When I rotate my phone, the app crashes...
Could you tell me how to solve this issue?
Here is my approach to find the solution, which is not working correctly:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int orientation = newConfig.orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4));
}
}
Thanks in advance!
The Recycle View supports AutofitRecycleView.
You need to add
android:numColumns="auto_fit"
in your xml file.You can refer to this AutofitRecycleViewLink
Try handling this inside your onCreateView method instead since it will be called each time there's an orientation change:
You can implement the method in your recyclerView onMeasure. First, create the java class AutofitRecyclerView
In your xlm layout file activity_main.xml
Then set the variable to the width of each item in the file size of the values folder values/dimens.xml
It can be for different screen resolutions values-xxhdpi/dimens.xml
In your activity in the onCreate event place the following code
In the onCreate () event you can use StaggeredGridLayoutManager
Then when the user rotates the screen capture the event, and change the number of columns automatically
A more robust way to determine the no. of columns would be to calculate it based on the screen width and at runtime. I normally use the following function for that.
It is a more dynamic method to accurately calculate the no. of columns. This will be more adaptive for users of varying screen sizes without being resticted to only two possible values.
NB: You can vary the value held by the scalingFactor variable. The smaller it is the more no. of columns you can display, and the larger the value the less no. of columns will be calculated. It is the scaling factor to tweak to your needs.
If you have more than one condition or use the value in multiple places this can go out of hand pretty fast. I suggest to create the following structure:
with
res/values/dimens.xml
being:and
res/values-land/dimens.xml
being:And the code then becomes (and forever stays) like this:
You can easily see how easy it is to add new ways of determining the column count, for example using
-w500dp
/-w600dp
/-w700dp
resource folders instead of-land
.It's also quite easy to group these folders into separate resource folder in case you don't want to clutter your other (more relevant) resources: