首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GridLayoutManager spanSizeLookup bug

GridLayoutManager spanSizeLookup bug
EN

Stack Overflow用户
提问于 2015-08-07 18:56:43
回答 4查看 9.6K关注 0票数 13

我对GridLayoutManger setSpanSizeLookup有一个问题,当活动的方向发生变化时,我会在检查特定位置是否是某种类型的同时更改span计数,这完全适用于方向更改,我唯一的问题是,我使用zxing库进行条形码扫描,每当单击button时,我将打开zxing的默认意图并从中检索日期,但是当zxing打开时,它会转到landscape,而我当前的活动方向是portrait --这给了我在只打开d9意图时布局管理抛出的IllegalArgumentException,崩溃日志如下所示

java.lang.IllegalArgumentException: Item at position 0 requires 2 spans but GridLayoutManager has only 1 spans.

这个问题不会发生,如果我旋转手机,只有当我启动Xzing意图,我不知道如何解决这个问题,因为它困扰我。这是我的spanSizeLookup -

代码语言:javascript
复制
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时才会发生错误

如果我打开zxing intent,而我的活动在landspace上,则不会发生崩溃。

编辑

似乎只有启动zxing的默认意图导致了这个问题,我有一个activity,它在启动之后就会出现landscape,而exception没有发生,作为解决办法,我创建了一个activity,它可以在延迟1秒内处理barcode扫描,以启动intent,就好像我没有这样做一样,它会抛出相同的exception。

编辑2

我刚刚发现,即使没有setSpanSpizeLookup,崩溃仍然会发生。只需打电话给manager.setSpanCount(getResources().getInteger(R.integer.span))

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-21 14:34:54

要回答这个问题为时已晚,然而,在我最近从事的一个项目中,我遇到了同样的问题&经过一些真正的调试之后,我发现问题的原因是什么,但不知道原因是什么。

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

票数 0
EN

Stack Overflow用户

发布于 2015-08-15 08:51:10

下面是在GridLayoutManager.layoutChunk()中抛出异常的源代码

代码语言:javascript
复制
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,看看它是如何工作的。

-更新

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

  1. 只更改spanCount。 您必须在更改LayoutManager.requestLayout()后调用spanCount。否则你的应用程序可能会崩溃。
  2. 只更改SpanSizeLookUp。 私有类CustomSpanSize扩展了GridLayoutManager.SpanSizeLookup {私有静态最终int LIST_SPAN_SIZE = 1;私有静态最终int GRID_SPAN_SIZE = 2;私有int mSpanSize = LIST_SPAN_SIZE;public void asList() { mSpanSize = LIST_SPAN_SIZE;} public void asGrid() { mSpanSize = GRID_SPAN_SIZE;} @Override int getSpanSize(int位置){int mSpanSize;} 然后像那样使用它 @覆盖受保护的recyclerView.setLayoutManager(mLayoutManager);onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mLayoutManager =新GridLayoutManager(this,2);mCustomSpanSize =新CustomSpanSize();mCustomSpanSize RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);RecyclerView(真);recyclerView.setLayoutManager(mLayoutManager);.} public void (){ if (改变){();{ mCustomSpanSize.asGrid();} //使用它来更新布局mAdapter.notifyDataSetChanged();//或者您可以使用它来更新布局mLayoutManager.requestLayout();} 这样即使你忘记打电话给notifyDataSetChangedrequestLayout,也不会崩溃
票数 9
EN

Stack Overflow用户

发布于 2015-08-15 06:42:37

编辑:调用setSpanCount()并使其成为一个比这个跨度更大的数字,不是吗?也许会有更多的代码出现。

听起来可能是并发修改错误。不要每次使用延迟,而是在UI线程上运行修改。这将阻止UI尝试访问列表。

代码语言:javascript
复制
if(adapter.getHolders().get(position).getLabelHolder() != null)
    return getResources().getInteger(R.integer.column);
else 
    return 1;

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

不是每次都是同一个号码吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31884809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档