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

그리드뷰 체크박스의 텍스트값 고정시키는 방법 알려주시면 감사하겟습니다ㅠㅠ

0 추천

커스텀 그리드뷰 구현시에 아이템에 체크된 개수 카운트가 되는데 겟뷰의 재활용으로 스크롤을 내렷다가 다시 올리면 아이템의 

텍스트가 다시 역순으로 재배열됩니다. 그래서 여러 방법을 짜봣는데 로직을 짜려니 도무지 감이 안잡히네요.

체크체인지리스너 밖으로 settext를 꺼내야 할것 같은데 그러면 카운트를 못받아오고 고수님들의 조언 부탁드립니다 ㅠㅠ

class GalleryAdapter2 extends BaseAdapter {

  

  @Override

    public View getView(final int position, View convertView, ViewGroup parent) {

        if (items.get(0) instanceof BucketItem) {

            ViewHolder holder;// show buckets

            if (convertView == null) {

                convertView = mInflater.inflate(R.layout.imageitem, null);

                holder = new ViewHolder();

                convertView.setTag(holder);

            } else {

                holder = (ViewHolder) convertView.getTag();

            }

 

            return convertView;

        } else { // show images in a bucket

            final ViewHolder holder2;

 

            if (convertView == null) {

                holder2 = new ViewHolder();

 

                // if it's not recycled, initialize some attributes

                convertView = mInflater.inflate(R.layout.allimageitem, null);

                holder2.icon = (ImageView) convertView.findViewById(R.id.icon);

                holder2.square = (CheckBox) convertView.findViewById(R.id.checkimage);

                holder2.counttext = (TextView) convertView.findViewById(R.id.count_text);

                convertView.setTag(holder2);

            } else {

                holder2 = (ViewHolder) convertView.getTag();

            }

 

            holder2.square.setTag(position);//Set Tag for CheckBox

            holder2.square.setChecked(mSparseBooleanArray.get(position));

            holder2.square.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override

                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    mSparseBooleanArray.put((Integer) buttonView.getTag(), isChecked);

 

                    if (isChecked){

                        holder2.counttext.setVisibility(View.VISIBLE);

                        count++;

                        selectnumber.add(count);

                    } else {

                        mSparseBooleanArray.delete((Integer)buttonView.getTag());

                        holder2.counttext.setVisibility(View.GONE);

                        count--;

                        selectnumber.remove(count);

 

                    }

 

                    holder2.counttext.setTextKeepState(String.valueOf(selectnumber.indexOf(count)+1));

                }

            });

 

            Glide.with(context).load(items.get(position).path)

                    .centerCrop()

                    .diskCacheStrategy(DiskCacheStrategy.ALL)

                    .into(holder2.icon);

 

            return convertView;

        }

    }

    public boolean isChecked(int position) {

        return mSparseBooleanArray.get(position, false);

    }

 

    public void setChecked(int position, boolean isChecked) {

        mSparseBooleanArray.put(position, isChecked);

        notifyDataSetChanged();

    }

 

    public void toggle(int position) {

        setChecked(position, !isChecked(position));

    }

 

    private static class ViewHolder {

        private ImageView icon;

        private TextView text;

        private CheckBox square;

        private TextView counttext;

 

    }

 

}

익명사용자 님이 2016년 8월 12일 질문

1개의 답변

0 추천
ViewHolder 패턴 자체가 아이템 레이아웃의 재사용을 위한 패턴이라 생길수 있는 문제입니다.

adapter 클래스 안에 별도로 체크한 아이템의 state 값을 저장하는 리스트를 추가하고 따로 관리하는것이 정신건강에 좋습니다.

getView에서는 체크박스 상태값을 위에 리스트에서 참조하도록 하는 방식으로 해보세요.
Development Guy (69,670 포인트) 님이 2016년 8월 12일 답변
adapter 클래스안에 int count = 0; 와 ArrayList<integer> selectNumber; 을 선언하고 체크 상태에 따라 카운트가 ++,--되고 이값을 selectNumber에 넣엇습니다. 문제는 setText 하는 부분이 리스너안에 존재하게 되어 말씀하신 재사용 문제때문에 스크롤 올릴시에 뷰가 재사용되면서 체크상태가 불러와지고 그 이후에 setText가 되면서 배열이 역순으로 되는것 같습니다. 그래서 리스너 밖으로 빼자니 count 가 0으로 선언되어 잇어서 카운트가 되지않고 넣자니 배열이 흐트러지고 이부분에서 해결방법이 있을까요? ㅠㅠ
제가말한 아이템의 state 값에 말씀하신 count값도 포함됩니다.
스크롤 올릴때 count값을 0으로 초기화 하시는거같은데 그러지 마시고
count는 create시에만 0으로 초기화 하거나 사용자가 체크 해제 및 체크 할때만 변경하시고 ArrayList<Integer> 타입을 ArrayList<체크상태값과 number값을 갖는 구조체> 이런식으로 하신 다음에 리스너 안에다가 조건을 추가(해당 position에 해당하는 ArrayList 값이 null 이 아니면 리스트를 참조하고 아니면 질문자님이 정의하신 정책으로 동작) 하시면 어느정도 질문자님이 요구하시는 동작에 맞출수 있을거 같은데요.
...