저장된 Checkbox 값을 다시 불러오는데 문제가 있습니다.

조회수 4130회

안녕하세요. 안드로이드 앱을 개발하고 있는데요, 제 앱에서 Listview 내의 체크박스를 선택 후 ArrayList에 해당 부분의 특정 텍스트를 담고 그 부분을 저장해놓고, 종료한 다음 저장했던 부분을 이용해 다시 켰을때 똑같은 체크박스가 체크되어야 하는데요,

for문을 사용해서 다음 코드와 같이 체크했습니다.

for(int i=0; i<TargetList.size(); i++) {
                if(TargetList.get(i).equals(appListItem.PackageName)) {
                    if(holder.checkBox.isChecked()) {
                        holder.checkBox.setChecked(false);
                    }
                    else {
                        holder.checkBox.setChecked(true);
                    }
                }
            }

그런데 이렇게 체크했더니 잘 되는 것 같았는데 가끔씩 누른 체크박스가 아닌 엉뚱한 다른 체크박스가 해제되는 문제가 발생했습니다. 몇 시간동안 생각해봤으나 어떻게 해결해야할지 잘 모르겠네요 ㅠㅠ

문제가 되는 Adapter의 getView 전체 소스코드 입니다.

    @Override
    public View getView(final int pos, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        final appListItem appListItem = mListData.get(pos);
        ArrayList<String> TargetList = Util.getStringArrayPref(context, "TargetList");
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        try {
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.select_listview, parent, false);
                holder = new ViewHolder();
                holder.PackageName = (TextView) convertView.findViewById(R.id.packagenames);
                holder.Label = (TextView) convertView.findViewById(R.id.applabel);
                holder.Icon = (ImageView) convertView.findViewById(R.id.appicon);
                holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.PackageName.setText(appListItem.PackageName);
            holder.PackageName.setTag(pos);
            holder.Label.setText(appListItem.Label);
            holder.Label.setTag(pos);

            if (appListItem.Icon != null) {
                holder.Icon.setVisibility(View.VISIBLE);
                holder.Icon.setImageDrawable(appListItem.Icon);
            } else {
                holder.Icon.setVisibility(View.GONE);
            }

            holder.checkBox.setChecked(((ListView)parent).isItemChecked(pos));
            holder.checkBox.setTag(pos);

            for(int i=0; i<TargetList.size(); i++) {
                if(TargetList.get(i).equals(appListItem.PackageName)) {
                    if(holder.checkBox.isChecked()) {
                        holder.checkBox.setChecked(false);
                    }
                    else {
                        holder.checkBox.setChecked(true);
                    }
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return convertView;
    }
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)