SparseArray在Android中的克隆



我正在尝试遍历SparseArray并删除一些项。

private SparseArray记录;

   int size = record.size();
        for (int index = 0; index < size; index++) {
            if (record.valueAt(index) < threshold){
                record.delete(record.keyAt(index));
            }
        }

但如果我在迭代的中途删除项目,大小就会改变,所以我不能使用这个。我事先尝试克隆稀疏阵列。但eclipse给了我错误

The method clone() from the type object is not visible

但是api文档和SparseArray的源代码都表明它是存在的并且是公共的。方法克隆还有一个注释@SuppressWarnings("unchecked")

抑制是否会改变方法的可见性
有人知道如何解决这个问题或克隆SparseArray吗?

根据Android API对SDK 14的更改,我们发现SparseArray被修改为包含public clone

编辑

在我的项目中,我为SB阵列实现了我自己的克隆代码:这里的源代码

为什么不这样得到数组的大小?还是只使用大小--无论何时删除记录?

    for (int index = 0; index < record.size(); index++) {
        if (record.valueAt(index) < threshold){
            record.delete(record.keyAt(index));
            index--;
        }
    }

FYI在support-v4中,SparseArrayCompat可用于解决此问题和更多问题:

http://developer.android.com/reference/android/support/v4/util/SparseArrayCompat.html

Clone方法对于Object类是受保护的,所以任何类都必须显式提供它,但我在文档中看到了这个方法,而在源代码中没有。似乎我的API Level10,而文档API level16。因此,请先检查您的API Level

@SuppressWarnings("unchecked")是因为ObjectClone方法返回Object,而从文档来看,它似乎返回了SparseArray<E>,这导致了将Object转换为SparseArray<E> 的方法内部不安全的强制转换

克隆仍然不会在Android文档中的API中更新,也不会在使用API 9 编译时显示任何警告

所以我写了自己的代码来克隆对象

public static SparseBooleanArray getClone(SparseBooleanArray sparseBooleanArray) {
    if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        return sparseBooleanArray.clone();
    return getCloneof(sparseBooleanArray);
}
private static SparseBooleanArray getCloneof(SparseBooleanArray sparseBooleanArray) {
    SparseBooleanArray temp = new SparseBooleanArray();
    try {
        int[] mKeys;
        boolean[] mValues;
        int mSize;
        Field mKeysField = sparseBooleanArray.getClass().getDeclaredField("mKeys");
        Field mValuesField = sparseBooleanArray.getClass().getDeclaredField("mValues");
        Field mSizeField = sparseBooleanArray.getClass().getDeclaredField("mSize");
        mKeysField.setAccessible(true);
        mValuesField.setAccessible(true);
        mSizeField.setAccessible(true);
        mKeys = (int[]) mKeysField.get(sparseBooleanArray);
        mValues = (boolean[]) mValuesField.get(sparseBooleanArray);
        mSize = (int) mSizeField.getInt(sparseBooleanArray);
        Field mKeysFieldtemp = temp.getClass().getDeclaredField("mKeys");
        Field mValuesFieldtemp = temp.getClass().getDeclaredField("mValues");
        Field mSizeFieldtemp = temp.getClass().getDeclaredField("mSize");
        mKeysFieldtemp.setAccessible(true);
        mValuesFieldtemp.setAccessible(true);
        mSizeFieldtemp.setAccessible(true);
        mKeysFieldtemp.set(temp, mKeys);
        mValuesFieldtemp.set(temp, mValues);
        mSizeFieldtemp.setInt(temp, mSize);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return temp;
}

相关内容

  • 没有找到相关文章

最新更新