GridLayoutManager spanSizeLookup 错误
GridLayoutManager spanSizeLookup bug
我遇到 GridLayoutManger
setSpanSizeLookup
的问题,当 activity 的方向发生变化时,我正在更改跨度计数,同时检查特定位置是否为某种类型,这对方向变化非常有效,我唯一的问题是,我正在使用 zxing
库进行条形码扫描,每当单击 button
时,我都会打开 zxing
默认意图和从中检索日期,但是当 zxing
打开时它转到 landscape
并且我当前的 activity 方向是 portrait
这给了我布局管理的 IllegalArgumentException
仅打开 Xzing
意图时抛出,崩溃日志如下
java.lang.IllegalArgumentException: Item at position 0 requires 2 spans but GridLayoutManager has only 1 spans.
如果我旋转 phone,则不会出现此问题,只会在我启动 Xzing
意图时发生,我无法真正弄清楚如何解决此问题,因为它困扰着我。这是我的 spanSizeLookup
-
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return adapter.getHolders().get(position).getLabelHolder() != null ? getResources().getInteger(R.integer.span) : 1;
}
});
span
基于屏幕大小,因此可以是 1-2、2-3 和 3-4。我重复一遍这不会给我任何关于方向改变的错误,只有当我打开 zxing
时才会出现错误
P.S 如果我在 activity 开启 landspace
时打开 zxing intent
,则不会发生崩溃。
编辑
似乎只启动了导致此问题的 zxing
默认意图,我有一个 activity
启动后 landscape
和 exception
没有发生,作为我所做的解决方法,是我创建了一个 activity
来处理 barcode
扫描,延迟 1 秒启动 intent
就好像我没有这样做,它会抛出相同的 exception
.
编辑 2
我刚刚发现,即使没有 setSpanSpizeLookup,崩溃仍然会发生。只需调用 manager.setSpanCount(getResources().getInteger(R.integer.span))
编辑:调用 setSpanCount() 并使其大于该跨度,不是吗?
也许需要更多代码。
听起来可能是并发修改错误。尝试不使用延迟,而是对 UI 线程进行 运行 修改。这将阻止 UI 尝试访问列表。
if(adapter.getHolders().get(position).getLabelHolder() != null)
return getResources().getInteger(R.integer.column);
else
return 1;
那么 getResources().getInteger(R.integer.column)
是什么?
这不是每次都是相同的数字吗?
这里是GridLayoutManager.layoutChunk()
中抛出异常的源码
final int spanSize = getSpanSize(recycler, state, pos);
if (spanSize > mSpanCount) {
throw new IllegalArgumentException("Item at position " + pos + " requires " +
spanSize + " spans but GridLayoutManager has only " + mSpanCount
+ " spans.");
}
您的 spanSize 是否大于 spanCount?尝试调试并可能更改您的 spanCount 并查看它是如何工作的。
----更新了----
有几种方法可以在列表和网格之间切换。
仅更改 spanCount。
您必须在更改 spanCount 后调用 LayoutManager.requestLayout()
。否则您的应用可能会崩溃。
仅更改 SpanSizeLookUp。
private class CustomSpanSize extends GridLayoutManager.SpanSizeLookup {
private static final int LIST_SPAN_SIZE = 1;
private static final int GRID_SPAN_SIZE = 2;
private int mSpanSize = LIST_SPAN_SIZE;
public void asList() {
mSpanSize = LIST_SPAN_SIZE;
}
public void asGrid() {
mSpanSize = GRID_SPAN_SIZE;
}
@Override
public int getSpanSize(int position) {
return mSpanSize;
}
}
并像那样使用它
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLayoutManager = new GridLayoutManager(this, 2);
mCustomSpanSize = new CustomSpanSize();
mLayoutManager.setSpanSizeLookup(mCustomSpanSize);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(mLayoutManager);
...
}
public void someFunction() {
if (changed) {
mCustomSpanSize.asList();
} else {
mCustomSpanSize.asGrid();
}
// use this to update the layout
mAdapter.notifyDataSetChanged();
// or you can use this to update the layout
mLayoutManager.requestLayout();
}
即使您忘记调用 notifyDataSetChanged
或 requestLayout
,这种方式也不会崩溃
令人惊讶的是,我遇到了同样的问题并且刚刚找到了解决方案。使用构造函数中传递的 spanCount 初始化 GridLayoutManager
后,我们的应用程序会崩溃。但是,如果我在构建对象后 setSpanCount()
,它就可以工作! :O
我们正在使用 RecyclerView 23.0.1。希望这对某人有所帮助。
来不及回答这个问题,但是在我最近的一个项目中,我遇到了同样的问题&经过一些真正的调试,我发现了问题的原因,但不知道为什么会导致它。
zxing
库 intent
它实际上在调用 startActivityForResult
之前调用了 CLEAR_TOP
& 这就是问题所在,在修改了 zxing
Intent
删除该特定行,崩溃就消失了。
我遇到 GridLayoutManger
setSpanSizeLookup
的问题,当 activity 的方向发生变化时,我正在更改跨度计数,同时检查特定位置是否为某种类型,这对方向变化非常有效,我唯一的问题是,我正在使用 zxing
库进行条形码扫描,每当单击 button
时,我都会打开 zxing
默认意图和从中检索日期,但是当 zxing
打开时它转到 landscape
并且我当前的 activity 方向是 portrait
这给了我布局管理的 IllegalArgumentException
仅打开 Xzing
意图时抛出,崩溃日志如下
java.lang.IllegalArgumentException: Item at position 0 requires 2 spans but GridLayoutManager has only 1 spans.
如果我旋转 phone,则不会出现此问题,只会在我启动 Xzing
意图时发生,我无法真正弄清楚如何解决此问题,因为它困扰着我。这是我的 spanSizeLookup
-
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return adapter.getHolders().get(position).getLabelHolder() != null ? getResources().getInteger(R.integer.span) : 1;
}
});
span
基于屏幕大小,因此可以是 1-2、2-3 和 3-4。我重复一遍这不会给我任何关于方向改变的错误,只有当我打开 zxing
时才会出现错误
P.S 如果我在 activity 开启 landspace
时打开 zxing intent
,则不会发生崩溃。
编辑
似乎只启动了导致此问题的 zxing
默认意图,我有一个 activity
启动后 landscape
和 exception
没有发生,作为我所做的解决方法,是我创建了一个 activity
来处理 barcode
扫描,延迟 1 秒启动 intent
就好像我没有这样做,它会抛出相同的 exception
.
编辑 2
我刚刚发现,即使没有 setSpanSpizeLookup,崩溃仍然会发生。只需调用 manager.setSpanCount(getResources().getInteger(R.integer.span))
编辑:调用 setSpanCount() 并使其大于该跨度,不是吗? 也许需要更多代码。
听起来可能是并发修改错误。尝试不使用延迟,而是对 UI 线程进行 运行 修改。这将阻止 UI 尝试访问列表。
if(adapter.getHolders().get(position).getLabelHolder() != null)
return getResources().getInteger(R.integer.column);
else
return 1;
那么 getResources().getInteger(R.integer.column)
是什么?
这不是每次都是相同的数字吗?
这里是GridLayoutManager.layoutChunk()
final int spanSize = getSpanSize(recycler, state, pos);
if (spanSize > mSpanCount) {
throw new IllegalArgumentException("Item at position " + pos + " requires " +
spanSize + " spans but GridLayoutManager has only " + mSpanCount
+ " spans.");
}
您的 spanSize 是否大于 spanCount?尝试调试并可能更改您的 spanCount 并查看它是如何工作的。
----更新了----
有几种方法可以在列表和网格之间切换。
仅更改 spanCount。
您必须在更改 spanCount 后调用
LayoutManager.requestLayout()
。否则您的应用可能会崩溃。仅更改 SpanSizeLookUp。
private class CustomSpanSize extends GridLayoutManager.SpanSizeLookup { private static final int LIST_SPAN_SIZE = 1; private static final int GRID_SPAN_SIZE = 2; private int mSpanSize = LIST_SPAN_SIZE; public void asList() { mSpanSize = LIST_SPAN_SIZE; } public void asGrid() { mSpanSize = GRID_SPAN_SIZE; } @Override public int getSpanSize(int position) { return mSpanSize; } }
并像那样使用它
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLayoutManager = new GridLayoutManager(this, 2); mCustomSpanSize = new CustomSpanSize(); mLayoutManager.setSpanSizeLookup(mCustomSpanSize); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(mLayoutManager); ... } public void someFunction() { if (changed) { mCustomSpanSize.asList(); } else { mCustomSpanSize.asGrid(); } // use this to update the layout mAdapter.notifyDataSetChanged(); // or you can use this to update the layout mLayoutManager.requestLayout(); }
即使您忘记调用
notifyDataSetChanged
或requestLayout
,这种方式也不会崩溃
令人惊讶的是,我遇到了同样的问题并且刚刚找到了解决方案。使用构造函数中传递的 spanCount 初始化 GridLayoutManager
后,我们的应用程序会崩溃。但是,如果我在构建对象后 setSpanCount()
,它就可以工作! :O
我们正在使用 RecyclerView 23.0.1。希望这对某人有所帮助。
来不及回答这个问题,但是在我最近的一个项目中,我遇到了同样的问题&经过一些真正的调试,我发现了问题的原因,但不知道为什么会导致它。
zxing
库 intent
它实际上在调用 startActivityForResult
之前调用了 CLEAR_TOP
& 这就是问题所在,在修改了 zxing
Intent
删除该特定行,崩溃就消失了。