k0s*_*0sh 10 android zxing gridlayoutmanager android-recyclerview
我遇到了一个问题GridLayoutManger setSpanSizeLookup,当活动方向发生变化时,我在检查特定位置是否是某种类型的同时更改跨度计数,这对于方向更改非常有效,我唯一的问题是,我正在使用zxing库来做条形码扫描,每当button点击一个我打开zxing默认意图并从中检索日期,但是当zxing打开它时landscape,我的当前活动方向是portrait这给了我IllegalArgumentException布局管理抛出时只打开Xzing意图,崩溃日志是这样的,
java.lang.IllegalArgumentException: Item at position 0 requires 2 spans but GridLayoutManager has only 1 spans.
如果我旋转手机不会发生这个问题,只有当我启动时才会发生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;
}
});
Run Code Online (Sandbox Code Playgroud)
的span是在屏幕上的大小碱,因此它可以是1-2,2-3和3-4.我再说一遍这并没有给我任何方向改变的错误,只有当我打开zxing
PS 时发生错误,如果我打开zxing intent我的活动在landspace崩溃时不会发生.
编辑
它似乎只是启动zxing导致此问题的默认意图,我有一个它发布后的activity地方,并没有发生,作为我做的解决方法,是我创建了一个处理扫描延迟1第二次发射,好像我没有那样做,它会抛出相同的.landscapeexceptionactivitybarcodeintentexception
编辑2
我刚刚发现,即使没有setSpanSpizeLookup,崩溃仍然会发生.只是打电话manager.setSpanCount(getResources().getInteger(R.integer.span))
这是抛出异常的源代码 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.");
}
Run Code Online (Sandbox Code Playgroud)
您的spanSize是否大于spanCount?尝试调试并可能更改您的spanCount并查看它是如何工作的.
- - 更新 - -
有几种方法可以在列表和网格之间切换.
只更改spanCount.
LayoutManager.requestLayout()更改spanCount后,您必须致电.否则您的应用可能会崩溃.
只更改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;
}
}
Run Code Online (Sandbox Code Playgroud)
并使用它
@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();
}
Run Code Online (Sandbox Code Playgroud)
即使你忘记调用这种方式不会崩溃notifyDataSetChanged或requestLayout
回答这个问题已经太晚了,但是在我从事的最新项目中,我遇到了同样的问题,经过一些真正的调试,我发现了问题的原因是什么,但不知道为什么会导致它。
zxingintent它实际上CLEAR_TOP在调用 & 之前调用了库startActivityForResult,这就是问题所在,修改源代码以zxing Intent删除该特定行后,崩溃消失了。
| 归档时间: |
|
| 查看次数: |
5976 次 |
| 最近记录: |