GridLayoutManager的spanSizeLookup错误

我有一个GridLayoutManger setSpanSizeLookup的问题,当一个活动的方向改变时,我正在改变跨度计数,而检查如果特定的位置是某种types,这完全适用于方向的变化,我唯一的问题是,我正在使用zxing库做条形码扫描,每当一个button被点击我打开zxing默认意图,并从中检索date,但是当zxing打开它去landscape ,我当前的活动方向是portrait这给了我的IllegalArgumentException布局在打开Xzing意图时pipe理抛出,崩溃日志是这样的
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; } }); 

span基于屏幕大小,因此它可以是1-2,2-3和3-4。 我重复一遍,这不会给我任何方向变化的错误,只有当我打开zxing时发生错误
PS如果我打开zxing intent而我的活动是在landspace崩溃不会发生。

编辑

它似乎只是启动zxing默认意图引起这个问题,我有一个activity ,它启动后,它的landscapeexception没有发生,作为一个解决方法,我做了,是我创build了一个activity ,处理barcode扫描延迟1秒发射的intent ,如果我不这样做,它会抛出同样的exception

编辑2

我刚刚发现,即使没有setSpanSpizeLookup,崩溃依然会发生。 通过调用manager.setSpanCount(getResources().getInteger(R.integer.span))

Solutions Collecting From Web of "GridLayoutManager的spanSizeLookup错误"

这是在GridLayoutManager.layoutChunk()中引发exception的源代码

 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吗? 尝试debugging,可能会改变你的spanCount,看看它是如何工作的。

– – 更新 – –

有几种方法可以在列表和网格之间切换。

  1. 只更改spanCount。

    更改spanCount后,必须调用LayoutManager.requestLayout() 。 否则你的应用可能会崩溃。

  2. 只更改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(); } 

    这种方式不会崩溃,即使你忘记调用notifyDataSetChangedrequestLayout

编辑:调用setSpanCount()并使它比这个跨越更大的数字? 也许更多的代码将是有序的。

这听起来像它可能是一个并发修改错误。 尽量不要使用每个sé的延迟,但在UI线程上运行修改。 这将阻止UI尝试访问列表。

 if(adapter.getHolders().get(position).getLabelHolder() != null) return getResources().getInteger(R.integer.column); else return 1; 

那么什么是getResources().getInteger(R.integer.column)

这不是每次都是一样的数字吗?

令人惊讶的是,我有同样的问题,只是find了解决办法。 在用构造函数传入的spanCount初始化GridLayoutManager之后,我们的应用程序会崩溃。 但是,如果我在构造对象之后设置了setSpanCount() ,那么setSpanCount()了! :o

我们正在使用RecyclerView 23.0.1。 希望这可以帮助别人。

现在回答这个问题来得太晚了,但是在最近的一个项目中,我遇到了同样的问题,经过一番真正的debugging,我发现问题的原因是什么,但是不知道为什么会导致这个问题。

zxingintent它实际上调用CLEAR_TOP之前调用startActivityForResult &这是问题,修改zxing Intent的源代码以删除该特定的行后,崩溃消失了。