안드로이드 개발 질문/답변
(글 수 45,052)
public class TestActivity extends Activity {
private CheckedItems checkedItems = new CheckedItems();
private SparseBooleanArray sba = new SparseBooleanArray();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sba.append(0, true);
sba.append(3, false);
sba.append(5, true);
checkedItems.setChecked(0, sba);
Log.d("MyTag", checkedItems.getChecked(0).size()+"");
sba.clear();
sba.append(4, true);
sba.append(2, false);
sba.append(3, false);
sba.append(7, true);
sba.append(5, false);
checkedItems.setChecked(1, sba);
Log.d("MyTag", checkedItems.getChecked(1).size()+"");
sba.clear();
Log.d("MyTag", checkedItems.getChecked(0).size()+"");
Log.d("MyTag", checkedItems.getChecked(1).size()+"");
}
class CheckedItems{
private Map<Integer, SparseBooleanArray> checkedItems;
CheckedItems(){
checkedItems = new HashMap<Integer, SparseBooleanArray>();
}
public void setChecked(int key, SparseBooleanArray sba){
checkedItems.put(key, sba);
}
public Map<Integer, Boolean> getChecked(int key){
Map<Integer, Boolean> checkedItemsBoolean = new HashMap<Integer, Boolean>();
for(int i = 0 ; i < checkedItems.get(key).size() ; i++){
checkedItemsBoolean.put(checkedItems.get(key).keyAt(i),
checkedItems.get(key).get(checkedItems.get(key).keyAt(i)));
}
return checkedItemsBoolean;
}
}
}위의 예제를 실행시키면 Log에 3 5 3 5 가 찍혀야할거 같은데 3 5 0 0 이 찍힙니다.
set(0) //3저장
get(0) //3찍임
set(1) //5저장
get(1) //5찍힘
get(0) //3 예상. 0찍임.
get(1) //5 예상. 0찍임.
2010.09.03 01:29:20
public class TestActivity extends Activity implements Cloneable{
private CheckedItems checkedItems = new CheckedItems();
private SparseBooleanArray sba = new SparseBooleanArray();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sba.append(0, true);
sba.append(3, false);
sba.append(5, true);
checkedItems.setChecked(0, sba);
sba.clear();
sba.append(4, true);
sba.append(2, false);
sba.append(3, false);
sba.append(7, true);
sba.append(5, false);
checkedItems.setChecked(1, sba);
sba.clear();
Log.d("MyTag", checkedItems.getChecked(0).size()+"");
Log.d("MyTag", checkedItems.getChecked(1).size()+"");
}
class CheckedItems {
private CopyItem ci;
private Map<Integer, SparseBooleanArray> copy;
CheckedItems(){
ci = new CopyItem();
copy = new HashMap<Integer, SparseBooleanArray>();
}
public void setChecked(int key, SparseBooleanArray sba){
ci.put(key, sba);
copy.putAll((Map<? extends Integer, ? extends SparseBooleanArray>) ci.clone());
}
public Map<Integer, Boolean> getChecked(int key){
Map<Integer, Boolean> checkedItemsBoolean = new HashMap<Integer, Boolean>();
for(int i = 0 ; i < copy.get(key).size() ; i++){
checkedItemsBoolean.put(copy.get(key).keyAt(i),
copy.get(key).get(copy.get(key).keyAt(i)));
}
return checkedItemsBoolean;
}
}
class CopyItem extends HashMap<Integer, SparseBooleanArray> implements Cloneable{
private static final long serialVersionUID = 1L;
public CopyItem() {
super();
// TODO Auto-generated constructor stub
}
public Object clone(){
Object o = null;
try{
o = super.clone();
}catch (Exception e){System.out.println("can't clone object");}
return o;
}
}
}
이렇게 해봤는데 잘 안되네요. 



님이 put하신건 객체 내용을 복제하는게 아닙니다.
레퍼런스를 복사한거죠... 그러니까 sba를 클리어하면 해시맵 안에 put한 것도 같이 클리어됩니다.