GridLayoutManager spanSizeLookup错误

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))

Tre*_*Cai 9

这是抛出异常的源代码 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并查看它是如何工作的.

- - 更新 - -

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

  1. 只更改spanCount.

    LayoutManager.requestLayout()更改spanCount后,您必须致电.否则您的应用可能会崩溃.

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

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


k0s*_*0sh 0

回答这个问题已经太晚了,但是在我从事的最新项目中,我遇到了同样的问题,经过一些真正的调试,我发现了问题的原因是什么,但不知道为什么会导致它。

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