마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

getview의 checkbox 중복 문제.

0 추천
다른 분들이 올려주신 방법으로도 해봤는데 아직 초보라 문제가 잘 안풀리네요 ㅠㅠ..

array잡고 인위적으로 값을 집어넣은게 아니라, 사진이나 영상을 따로 추가하고 삭제하면서 전체 리스트의 길이가

늘 바뀔 수 도 있는 경우구요.

 

처음 시도해본 방법은

배열 하나 더 만들어서, for문으로 체크된 녀석만 최종적으로 boolean 연산을 통해 체크하도록하고, 체크가 안 된 녀석은 안되게끔 했습니다. 이 결과, 일단 스크롤로 위아래로 움직일 때 체크하지 않은 녀석들이 지 멋대로 체크 되는 경우는 방지 했는데, 체크 된 녀석들이 다시 풀려버리네요. 그래서 안펍에서 이런 저런 자료들을 찾는데 도저히 방법을 못찾겠습니다..

일단 아래와 같이 setOnClickListener를 두었구요. 그 후에 setOnCheckedChangeListener를 두었는데.

참고글에서는 setTag와 getTag를 이용하라 하더군요.. ;; 제가 아직 전반적으로 이해를 완전히 안한 탓도 있지만,.. 배열로 하자니 문제가 완전히 해결되지 않아 다시 한 번 더 조언을 구합니다 ㅠ
anci (19,950 포인트) 님이 2013년 6월 26일 질문
anci님이 2013년 6월 26일 수정

2개의 답변

0 추천
 
채택된 답변
boolean array를 getcount() 갯수만큼 할당하고,  

getview 할 때, 해당 array의 값이 false 면 ui도 false로, true 면 ui도 true로 갱신하면 될 것 같은데요.

 

물론 해당 array에 대해서 실제 ui 에서 check 이벤트가 발생했다면, check 상태에 따라 true/false로

설정을 바꾸셔야하구요.
익명사용자 님이 2013년 6월 26일 답변
anci님이 2013년 6월 26일 채택됨
답변 감사드립니다.:D
제가 초보라 잘 이해하지 못하는데,
현재 list에 뿌려지는 파일들의 갯수를 리턴하는 getcount를 boolean array에도 적용하라는건가용..? 그리고 getview 호출할 때 array ui의 T/F갱신은 무슨 말씀이신지 잘 모르겠습니다..ㅠ_ㅠ)
0 추천
this.list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

    public String[] getCheckedItems() {
        if (list == null) {
            return null;
        }

        SparseBooleanArray spItems = list.getCheckedItemPositions();
        String[] trigger = new String[list.getCheckedItemCount()];

        int j = 0;
        for (int i = 0; i < spItems.size(); i++) {
            if (spItems.get(i) == true) {
                int pos = spItems.keyAt(i);
                trigger[j++] = items[pos];
            }
        }

        return trigger;
    }


    class DlgAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return items.length;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            if (convertView == null) {
                convertView = inflate(layoutId);

                holder = new ViewHolder();
                holder.checked = (CheckedTextView) convertView.findViewById(R.id.checked);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }

            holder.checked.setText(items[position]);

            return convertView;
        }
    }

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/checked"
    android:layout_width="match_parent"
    android:layout_height="65dp"
    android:gravity="center_vertical"
    android:paddingLeft="12dp"
    android:paddingRight="20dp"
    android:checkMark="?android:attr/textCheckMark" 
    android:textSize="20sp" />

 

aucd29 (218,390 포인트) 님이 2013년 6월 26일 답변
...