包含realmObjects的RecyclerViews的寻呼机与IllegalState

时间:2015-06-09 09:48:08

标签: android android-viewpager realm

我有一个使用Realm.io存储实体的项目,以前工作正常,但现在我有一个包含3个片段的片段或活动,其中包含Realm对象列表。

每当我切换到一个页面并返回到第一个页面(或者只是返回页面时)。我得到java.lang.IllegalStateException:非法状态:行/对象不再有效进行操作。它被删除了吗?

这似乎是因为对象不再有效。是否有一种简单的方法来分离它们或什么?尽管如此,如果他们保持管理会很好,因为我有时希望能够删除它们。

从数据库中查询这些项目,当没有足够的项目时,它们将从API加载。这里没有使用任何非常奇特的东西,三个带有适配器的列表加载实体。每个列表的差异是字符串值状态,表示它是否处于某种状态。

在单击列表项以显示详细信息后,从适配器加载项目时出现错误:

MyEntity myEntity = (MyEntity) adapter.getItem(position);
intent.putExtra("id", myEntity.getId()) <-- this part will crash it.

,例外:

java.lang.IllegalStateException: Illegal State: Row/Object is no longer valid to operate on. Was it deleted?

我想这是因为它在三个位置(3个选项卡)查询相同类型的数据。虽然我希望这不是一个问题,因为它们都有自己的适配器和项目列表。从他们自己的实例中获取。

这是我的“Loader”类调用的代码,它处理来自DB和/或Api的提取。

public void loadResult(List result,boolean isFinished){         //不是最好的速度,但最多10个项目,没有重复和尊重原始订单是好的         尝试{             for(RealmObject ro:result){                 记录r =(记录)ro;

                int itemIndex = items.indexOf(r);
                if (itemIndex > -1) {
                    items.set(itemIndex, r);
                } else {
                    items.add(r);
                }

        }
    } catch (IllegalStateException e) {
        ErrorClass.log(e);
    }

    notifyDataSetChanged();

    setLoading(!isFinished);
    end = result.size() < 10 && isFinished;
}

简而言之,加载器类就是这样做的,它不是单例,它是每个Listview(Recycler)的新实例

        List result = null;
        if (sortKey != null) {
            result = query.findAllSorted(sortKey, ascending);
        } else {
            result = query.findAll();
        }

        if (result.size() < PAGE_SIZE && retry == 0) {
            isFinished = false;
            retry++;
            getPageFromApi(pageNumber);
        } else if (retry > 0) {
            retry = 0;
        }

        adapter.loadResult(result, isFinished);

getPageFromApi将导致再次调用此代码,并且将在列表中替换现有实体,添加新项目。因此,单击列表时,列表中不应存在旧的已删除项目。

我认为这可能非常具体,但我的问题必须有全球性的原因/解决方案。

1 个答案:

答案 0 :(得分:0)

愚蠢的我,由于之前的错误,我在try catch中添加了新元素,出现了什么问题非常简单。在Loader中,从我们的API获取的项目正在更新或创建新项目。这意味着列表中的那些在那一点上是无效的,或者至少是指向它们的指针?不确定它是如何在幕后工作的。

我做了什么来修复它,循环遍历所有当前项目,并检查isValid(),如果为false则该项目将被删除。否则我正在检查新项目是否在当前项目列表中,这会导致错误发生在.equals函数中!

这一件事可能是一个核心错误,但我认为这只是我的错误!