2012-08-28 62 views
2

我正在嘗試遍歷SparseArray並刪除一些項目。Android中的SparseArray克隆

private SparseArray record;

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

但如果我刪除項目中途迭代,大小會發生變化,所以我不能用這個。 我試圖預先克隆稀疏數組。但日食給我的錯誤

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

但兩者API文檔和SparseArray的的源代碼表明它是當前和公衆。 此外方法克隆有一個註釋@SuppressWarnings("unchecked")

抑制改變方法的可見性?
任何人都有線索如何解決這個問題或克隆SparseArray?

+0

您正在開發什麼版本的Android? – oldrinb

+0

targetsdk是15和minsdk是8 – nandeesh

+0

看到我的編輯到xandy的帖子 – oldrinb

回答

1

Clone法的保護期爲Object類,所以任何類有明確規定,但但是我看到這個方法文檔和不在源代碼中。似乎我的API Level10和文檔API level16。所以請先檢查你的API Level

@SuppressWarnings("unchecked")是因爲Object回報ObjectClone方法,其中從DOC似乎它返回SparseArray<E>導致不安全的投裏面方法Object轉換爲SparseArray<E>

+0

它是目前SDK> = 14. – oldrinb

2

你爲什麼不得到數組的大小喜歡這個?或者只是使用大小 - 每當你刪除一條記錄?

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

但索引將有已經遞增,所以它會跳過一個條目 – nandeesh

+0

剛更新我的回答 – Wayne

+0

+1。我曾考慮過它,但它使代碼混淆。 – nandeesh

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; 
}