안드로이드 개발 질문/답변
(글 수 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();
이렇게 타협봤습니다.
막히면 일단 한숨 자는게 진리인듯...