[안드로이드] 체크박스 전체선택 문제(배열문제)
by 볼펜 | 12.06.27 11:35 | 2,391 hit
초보 안드로이드 개발자도 아닌 그냥 인간입니다..ㅠㅠ
인터넷에서 참조한 소스 가지고 체크박스 전체 선택을 만들려고 합니다.
얼추 다 만든거 같은데 참조한 소스는 리스트뷰에 이미 데이터가 있는 상태인 소스를 가지고 체크를 했습니다.
근데 저같은 경우는 어떠한 행동을 취했을 때 커스텀 어댑터로 데이터가 하나씩 들어갑니다.
커스텀 어댑터에서 첫 시작할때 리스트뷰의 배열이 선언 되더라구요..
계속 리스트뷰에 데이터가 추가 되기 때문에 추가 된 배열사이즈를 얻어오고싶은데
어떻게 수정해야할까요..? ㅠㅠ
 
-전체 체크 시작 소스-
mAllCheckBox = (CheckBox) v.findViewById(R.id.AllCheck);
    mAllCheckBox.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
       Result_Adapter.setAllChecked(mAllCheckBox.isChecked());
       Result_Adapter.notifyDataSetChanged();
        }
    });

-어댑터-
public class Result_Adapter extends BaseAdapter implements
  OnCheckedChangeListener {
 ViewHolder holder = null;
 LayoutInflater mInflater = null;
 ArrayList<String> mCheckList;
 String mPosition;
 Context mContext;
 ArrayList<HashMap<String, Object>> m_Map = inventory_josa.ResultDatalist;
 private boolean[] isCheckedConfrim;
 public Result_Adapter(Context context,
   ArrayList<HashMap<String, Object>> ResultDatalist) {
  mContext = context;
  mInflater = LayoutInflater.from(context);
  this.m_Map = ResultDatalist;
  this.mCheckList = new ArrayList<String>();
  this.isCheckedConfrim = new boolean[m_Map.size()]; <---- m_Map.size가 처음엔 0 이더라구요.. 이부분 때문에 밑에 소스가 에러가 납니다..ㅠㅠ 배열을 직접 숫자로 잡고 하면 문제없이 전체선택도 되고 에러도 없습니다..
 }
 public void setAllChecked(boolean ischeked) {
  if (isCheckedConfrim != null) {
   int tempSize = isCheckedConfrim.length;
   for (int i = 0; i < tempSize; i++) {
    isCheckedConfrim[i] = ischeked;
   }
  }
 }
@Override
 public View getView(int position, View convertView, ViewGroup parent) {
   ...소스가 길어서 생략
    holder.Check.setChecked(isCheckedConfrim[position]); <--- 데이터가 1개라도 없으니 에러 발생
 }
}
 
질문자가 자신의 포인트 150 점을 걸었습니다.
답변하시면 포인트 10을, 답변이 채택되면 포인트 120을 드립니다.

볼펜 님의 개발 Q&A 최신글 [더보기]

질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

by 신축 2012.06.27 14:07
adapter의 getView에서
holder.Check.setChecked(isCheckedConfrim[position])
하기전에 isCheckedConfrim의 length를 먼저 채크 하시면 될것 같네요.
if(isCheckedConfrim.length > 0) <<<<
추천 0 반대 0
by 볼펜 2012.06.27 15:02
근데 그 부분을 그렇게 바꾸면 전체 체크가 안되요..ㅠㅠ
추천 0 반대 0
by 신축 2012.06.27 15:31
전체 체크랑 무슨 관계인가요? ;;;
getView에서 setChecked할때 isCheckedConfrim배열의 길이 채크하는것인데....
그 배열의 크기가 곧 리스트의 item 개수 아닌가요??
추천 0 반대 0
by 볼펜 2012.06.27 15:36
this.isCheckedConfrim = new boolean[m_Map.size()];
어댑터에서 처음에 이렇게 만들어줍니다.
하지만 저 m_Map에는 아무것도 없죠..
제가 만드는 어플에서 뭔가 하나씩 실행 할때마다 저 m_Map에 어댑터가 하나씩 들어가게 됩니다..
저는 지금 저 m_Map의 배열을 실시간으로 받아올수 있는걸 알고싶은거에요 ㅠㅠ
사실 this.isCheckedConfrim = new boolean[m_Map.size()]; 에
this.isCheckedConfrim = new boolean[숫자 아무거나];
이렇게만 넣어도 잘 체크 되요.. 
추천 0 반대 0
by 신축 2012.06.27 16:13
adapter 생성해서 setAdapter하는 부분은 없어서 잘 모르겠지만 볼펜님이 말씀하시는 부분하고 제가 아까 말씀드린
배열 길이 체크하는 부분하고 어떤 관련이 있는지 모르겠네요. 제 말은 방어코드를 넣으라고 말씀드린건데요....
그리고 질문하신부분은 배열 사이즈를 얻어 오고 싶다고 하셨는데
밑에서는 에러가 난다고 하시고 ㅎㅎ 질문의 핵심이 뭐인지좀 ......
추천 0 반대 0
by 볼펜 2012.06.27 16:20
제 댓글이 왜 저렇게 됐죠..ㅠㅠ
제 핵심은 this.isCheckedConfrim = new boolean[m_Map.size()];
저 부분에서 m_Map.size() <-- 제 리스트뷰에서 어댑터가 하나씩 쌓일때마다 실시간으로 사이즈를 가져오고싶은겁니다..ㅠㅠ Adapter 생성은 onCreate에서
Result_Adapter = new Result_Adapter(this, ResultDatalist);
이렇게 생성을 해주구요
setAapter는 말해드린 어떠한 행동을 헀을때 어댑터가 리스트뷰에 하나씩 쌓인다 했던 그 부분이
resultDataListView.setAdapter(Result_Adapter);
이런식으로 소스 만들었씁니다.
ArrayList<HashMap<String, Object>> m_Map = inventory_josa.ResultDatalist;
이런식으로 m_Map에 inventory_josa에 있는 ResultDatalist를 가져와서 넣어주구요..
ResultDatalist는 ArrayList<HashMap<String, Object>>로 만들어졌구요 ㅠㅠ
추천 0 반대 0
by 신축 2012.06.27 16:33
그렇게 가변적인 데이터가 바뀌는 것이면 멤버변수 선언해주는 곳에서 객체를 생성하는 방법이 별로 좋아 보이지 않습니다.
어차피 생성할때 데이터가 없으면 기본값으로 선언해 주는 것이나 마찬가지니까 말이죠.
this.isCheckedConfrim = new boolean[m_Map.size()]; 이부분은 어차피
adapter최초 생성시 딱 한번 불리기 때문에 m_Map.size가 첨부터 크기를 갖지 않는 이상 필요 없는 작업입니다.
볼펜님이 원하는 대로 하실려면 정해진 사이즈를 제공하는 배열보다 vecter쪽으로 생각을 전환해 보시는걸 추천합니다.
가변적인 데이터로 어떠한 작업을 하실려면 매번 객체를 생성해서 리소스 낭비 하는거 보다 좋은 방법으로 생각됩니다.
추천 0 반대 0
by 볼펜 2012.06.27 17:21
vecter요?? 흐음.. 가짜데이터인가요..? 흠흠.. 어디서 들어본거같긴한데 .. ㅠㅠ 어떤식으로 사용하는건가요?
추천 0 반대 0
by 신축 2012.06.27 17:36
그냥 예로 해서 말씀드린거고 arraylist같은거 사용하세요.
ture, false 만 필요하면 arrayList<Boolean> 으로 만든후 사용하면 원하는 방향으로 나올꺼라
생각이 됩니다만....
추천 0 반대 0
by 볼펜 2012.06.27 18:12
어떤식으로 해야할까요...ㅠㅠ 감이 안잡히네요..ㅠㅠ
추천 0 반대 0
안드로이드사이드 PC버전 로그인