【问题标题】:Android: detecting removed item in ObservableListAndroid:检测 ObservableList 中已删除的项目
【发布时间】:2017-06-29 09:38:50
【问题描述】:

我在我的模型中使用 ObservableList 进行绑定。当从 ObservableList 中删除该项目时,我想知道哪些项目已被删除。所以我使用ObservableList.OnListChangedCallback

当项目被删除时,它将调用onItemRangeRemoved()。但问题是该项目已从 onItemRangeRemoved() 的 ObservableList 中删除。

catDatas.addOnListChangedCallback(new ObservableList.OnListChangedCallback<ObservableList<CatData>>()
{
    @Override
    public void onChanged(ObservableList<CatData> sender)
    {
    }
    @Override
    public void onItemRangeChanged(ObservableList<CatData> sender, int positionStart, int itemCount)
    {
    }
    @Override
    public void onItemRangeInserted(ObservableList<CatData> sender, int positionStart, int itemCount)
    {
    }
    @Override
    public void onItemRangeMoved(ObservableList<XROrderItemData> sender, int fromPosition, int toPosition, int itemCount)
    {
    }
    @Override
    public void onItemRangeRemoved(ObservableList<CatData> sender, int positionStart, int itemCount)
    {
        for (int idx = itemCount - 1; idx >= 0; idx--)
        {
            CatData data = sender.get(idx + positionStart);  //this line will throw index out of bounds exception
            ...
            ...
            ...
            uninitData(data);
        }
    }
});

知道如何捕获被移除的项目吗?

谢谢...

【问题讨论】:

    标签: java android android-databinding observablelist


    【解决方案1】:

    Google 的人忽略了 removeAll() 方法,因此它不会通知观察者。要解决此问题,请使用此自定义类:

    class MyObservableArrayList<T>: ObservableArrayList<T>() {
    
        override fun removeAll(elements: Collection<T>): Boolean {
            var success = false
            elements.forEach { if (super.remove(it)) success = true }
            return success
        }
    
    }
    

    【讨论】:

    • 如果您遇到此错误,请为我在 Google 问题跟踪器上创建的问题加注星标:issuetracker.google.com/issues/113075721
    • 嗨,Peter,这并不能修复 Remove() 和 RemoveAll() 的行为,当 onItemRangeRemoved() 被提升时,该项目已从 ObservableList 中删除。但是 +1 建议覆盖 ObservableArrayList。
    • 啊,对不起,我应该更仔细地阅读你的问题。在您的情况下,覆盖类和 onItemRangeRemoved() 是要走的路。当然已经一年了,你可能已经继续前进了,哈哈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多