我正在尝试迭代SparseArray并删除一些项目。
私人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 doc和SparseArray的源代码都表明它存在并且是公开的。
方法clone也有一个注释@SuppressWarnings("unchecked")
抑制是否会改变方法的可见性?
任何人都知道如何解决这个问题或克隆SparseArray?
答案 0 :(得分:2)
根据Android API changes for SDK 14,我们发现SparseArray
was modified to include a public
clone
。
修改
在我的项目中,我为SB数组实现了自己的克隆代码:Source code here
答案 1 :(得分:2)
为什么不像这样得到数组的大小?或者只是使用尺寸 - 每当你删除一条记录?
for (int index = 0; index < record.size(); index++) {
if (record.valueAt(index) < threshold){
record.delete(record.keyAt(index));
index--;
}
}
答案 2 :(得分:2)
FYI在support-v4中,SparseArrayCompat可用于解决此问题及其他问题:
http://developer.android.com/reference/android/support/v4/util/SparseArrayCompat.html
答案 3 :(得分:1)
Clone
方法受Object
类保护,因此任何类都必须明确提供它,但是我在文档中看到了这个方法而在源代码中没有。似乎我的API Level
为10
而文档API level
为16
。因此,请先检查API Level
。
@SuppressWarnings("unchecked")
是因为Clone
Object
方法会返回Object
,因为从doc开始,它似乎返回SparseArray<E>
,这会导致内部方法不安全将Object
转换为SparseArray<E>
答案 4 :(得分:1)
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;
}