横竖屏切换时RecyclerView布局仅首次生效问题求助
问题修复:横竖屏切换时RecyclerView布局不更新的解决办法
嘿,我帮你定位到问题啦!你的代码里有两个关键问题导致横竖屏切换时布局失效:
dpWidth没有实时更新:你应该是只在Fragment初始化时计算了一次dpWidth,横竖屏切换后屏幕宽度变了,但这个变量还是旧值,所以判断逻辑一直走最后一个分支(LinearLayoutManager)。- 横竖屏判断用错了常量:你用的
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE是用来设置屏幕方向的常量,而判断当前方向应该用Configuration.ORIENTATION_LANDSCAPE,这也会导致横屏的条件永远不成立。
下面是修复后的完整代码:
修复后的changeFeedsLayout()方法
private void changeFeedsLayout(Configuration config) { // 每次调用都重新计算当前屏幕的dp宽度 DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); float dpWidth = displayMetrics.widthPixels / displayMetrics.density; // 根据宽度和横竖屏状态选择布局管理器 if (dpWidth > 720 && config.orientation == Configuration.ORIENTATION_LANDSCAPE) { instagram_feeds.setLayoutManager( new GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false) ); } else if (dpWidth > 520) { instagram_feeds.setLayoutManager( new GridLayoutManager(context, 2, LinearLayoutManager.VERTICAL, false) ); } else { instagram_feeds.setLayoutManager( new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) ); } }
更新onConfigurationChanged()方法
直接把横竖屏切换后的新配置传进去,不用再重复获取:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); changeFeedsLayout(newConfig); }
额外优化建议
为了避免从后台切回或者Fragment重新显示时布局异常,建议在onResume()里也调用一次:
@Override public void onResume() { super.onResume(); changeFeedsLayout(getResources().getConfiguration()); }
这样修改后,不管是横竖屏切换,还是切换Fragment再返回,RecyclerView的布局都能正确更新啦!
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

