当前位置: 首页 > 知识库问答 >
问题:

使用GridLayoutManager和RecyclerView更改列数

吴腾
2023-03-14

在我的片段中,我通过以下方式设置我的GridLayout:mRecycler.setLayoutManager(new GridLayoutManager(rootView.getContext(), 2));

所以,我只想在用户旋转手机/平板电脑时,将< code>2改为< code>4。我已经了解了< code > onConfigurationChanged ,并尝试让它为我的情况工作,但它并没有以正确的方式进行。当我旋转手机时,应用程序崩溃了...

你能告诉我如何解决这个问题吗?

以下是我找到解决方案的方法,但效果不佳:

  @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));
        }
    }

提前感谢!

共有3个答案

步嘉德
2023-03-14

除了答案。也可以仅使用XML属性完成。下面是代码。

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/pax_seat_map_rv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:spanCount="3"
        android:orientation="vertical"
        app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" />
巩选
2023-03-14

请尝试在onCreateView方法中处理此问题,因为每次方向发生变化时都会调用它:

if(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
     mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
}
else{
     mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4));
}
裘臻
2023-03-14

如果您有多个条件或在多个地方使用该值,这可能会很快失控。我建议创建以下结构:

res
  - values
    - dimens.xml
  - values-land
    - dimens.xml

res/values/dimens.xml是:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="gallery_columns">2</integer>
</resources>

res/value-land/dimens.xml是:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="gallery_columns">4</integer>
</resources>

然后代码变成(并永远保持)如下:

final int columns = getResources().getInteger(R.integer.gallery_columns);
mRecycler.setLayoutManager(new GridLayoutManager(mContext, columns));

您可以很容易地看到添加确定列计数的新方法是多么容易,例如使用-w500dp/-w600dp/-w700dp资源文件夹而不是-land

将这些文件夹分组到单独的资源文件夹中也很容易,以防您不想弄乱其他(更相关)的资源:

android {
    sourceSets.main.res.srcDir 'src/main/res-overrides' // add alongside src/main/res
}
 类似资料:
  • 我正在参加在线android工作室课程,我坚持这项任务。 将RecyclerView的layoutManager属性更改为GridLayoutManager https://github.com/google-developer-training/android-basics-kotlin-affirmations-app-solution

  • 我使用的是,它用于根据中的当前查询筛选中的数据,如如何使用SearchView筛选RecyclerView中所述。 问题是项目的顺序也必须能够改变。通过具有方法的类与交互。如果用户更改了项目的排序方式,我需要更改它,但我不确定如何做到这一点。 当前的情况只需要颠倒顺序,所以这个问题可以通过和来解决,但我想知道如何提供一种完全不同的方式来排序中的项目。

  • 我知道我可以用跨越两列: 但是我怎样才能使第一个项目也跨越2行呢? 我曾尝试通过将其他项目的高度增加一倍来设置第一个项目的高度,但这导致与第一个项目相同行的每个项目也被拉伸到该高度:

  • 如何使用网格布局管理器水平显示三行三列的循环视图项目,增加垂直增加的价值,类似于下图

  • 为电视应用程序创建了双向滚动网格布局 从布局文件查看结构 所以我使用了gridlayoutmanager(方向垂直)和spancount 49(24小时*2)1来显示列中的图像。第一行显示分为半小时时段的时间线,第一列显示频道,每个频道都有自己的节目在不同的时段运行。现在我实现了双向滚动gridlayout,现在我还有两件事要做。 1)当水平滚动时,通道列(第一列)也会滚动,因此会被隐藏(但它必须

  • 我正尝试在中为每一行水平居中所有项目 我尝试了很多东西:作为父级的RelativeLayout,然后使用layout_centerInParent,使用基本的Android:layout_gravity=“center”,尝试添加一些space元素,使用权重和....在 中,但我没有成功:( 我所拥有的 活动中 item_row.xml 我在谷歌上搜索了很多,找到了这个答案,但实际上我不知道如何为