我正在尝试遍历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 Level
是10
,而文档API level
是16
。因此,请先检查您的API Level
。
@SuppressWarnings("unchecked")
是因为Object
的Clone
方法返回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;
}