안드로이드 개발 질문/답변
(글 수 45,052)
그냥가자님 조언으로 clone 문제를 해결(?)한거 같은데 원하는 결과가 안나오네요.
sba.clear() 후에 다른값을 넣기전에 찍어보면 원하는 값이 나온는데 , sba 에먼가를 넣으면 값이 이상해지는거 같네요.
clone()를 잘못 쓴건지...SparseBooleanArray 가 특별한건지...
어디를 손봐야 값을 set 한후에 원할때 get를 하면 원하는 결과를 얻을까요?
지금 현재 결과는 012 012 34567 453 34567 이 나오는데 012 012 34567 012 34567 가 원하는 값입니다.
sba.clear() 후에 다른값을 넣기전에 찍어보면 원하는 값이 나온는데 , sba 에먼가를 넣으면 값이 이상해지는거 같네요.
clone()를 잘못 쓴건지...SparseBooleanArray 가 특별한건지...
어디를 손봐야 값을 set 한후에 원할때 get를 하면 원하는 결과를 얻을까요?
지금 현재 결과는 012 012 34567 453 34567 이 나오는데 012 012 34567 012 34567 가 원하는 값입니다.
public class TestActivity extends Activity{
private CheckedItems checkedItems = new CheckedItems();
//private SparseBooleanArray sba = new SparseBooleanArray();
private CopyItem sba = new CopyItem();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("MyTag", "======================== ");
sba.put(0, true);
sba.put(1, false);
sba.put(2, true);
checkedItems.setChecked(0, (SparseBooleanArray) sba.clone());
for(int i = 0 ; i < checkedItems.getChecked(0).size() ; i++ ){
Log.d("MyTag", checkedItems.getChecked(0).keySet().toArray()[i]+" (page:0)");
}
Log.d("MyTag", sba.hashCode()+" sba");
Log.d("MyTag", sba.clone().hashCode()+ " clone");
sba.clear();
for(int i = 0 ; i < checkedItems.getChecked(0).size() ; i++ ){
Log.d("MyTag", checkedItems.getChecked(0).keySet().toArray()[i]+" (page:0)");
}
Log.d("MyTag", "======================== ");
sba.put(3, true);
sba.put(4, false);
sba.put(5, false);
sba.put(6, true);
sba.put(7, false);
checkedItems.setChecked(1, (SparseBooleanArray) sba.clone());
for(int i = 0 ; i < checkedItems.getChecked(1).size() ; i++ ){
Log.d("MyTag", checkedItems.getChecked(1).keySet().toArray()[i]+" (page:1)");
}
Log.d("MyTag", sba.hashCode()+" sba");
Log.d("MyTag", sba.clone().hashCode()+ " clone");
sba.clear();
Log.d("MyTag", sba.size()+ " size");
Log.d("MyTag", "======================== ");
for(int i = 0 ; i < checkedItems.getChecked(0).size() ; i++ ){
Log.d("MyTag", checkedItems.getChecked(0).keySet().toArray()[i]+" (page:0)");
}
Log.d("MyTag", sba.hashCode()+" sba");
Log.d("MyTag", sba.clone().hashCode()+ " clone");
Log.d("MyTag", "======================== ");
for(int i = 0 ; i < checkedItems.getChecked(1).size() ; i++ ){
Log.d("MyTag", checkedItems.getChecked(1).keySet().toArray()[i]+" (page:1)");
}
Log.d("MyTag", sba.hashCode()+" sba");
Log.d("MyTag", sba.clone().hashCode()+ " clone");
Log.d("MyTag", "======================== ");
}
class CheckedItems{
private Map<Integer, SparseBooleanArray> copy;
CheckedItems(){
copy = new HashMap<Integer, SparseBooleanArray>();
}
public void setChecked(int key, SparseBooleanArray sba){
copy.put(key, sba);
/*
*setChecked에 올바른 값이 들어갔는지 확인용
*
for(int i = 0 ; i < checkedItems.getChecked(key).size() ; i++ ){
Log.d("MyTag", checkedItems.getChecked(key).keySet().toArray()[i]+" setChecked");
}
*/
}
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 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;
}
}
}



sba.clear();
sba = new CopyItem();
이렇게 타협봤습니다.
막히면 일단 한숨 자는게 진리인듯...