빡빡종
345
2019-01-01 17:31:33 작성 2019-01-01 17:35:34 수정됨
1
152

커스텀리스트뷰 체크박스 체크상태 저장


리스트뷰에서 체크박스가 계속 중복체크 되서 질문을 올렸는데

viewholder랑 체크상태를 저장하는거까지 만들어야한다고 하셔서

해봤는데

제대로 체크가 안되네요 코드 한번 보시고 틀린부분좀 찾아주시면 감사하겠습니다.



public class myAdapter extends BaseAdapter {
    ArrayList<appVo> arr;
    private LayoutInflater lif;
    private Context context;
    private int layout;


    SharedPreferences pref;
    SharedPreferences.Editor editor;


    public myAdapter(Context context, int layout, ArrayList<appVo> arr) {
        this.arr = arr;
        this.layout = layout;
        this.context = context;
        this.lif = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return arr.size();
    }

    @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) {
        final ViewHolder viewHolder;

        pref = context.getSharedPreferences("isCheck", Activity.MODE_PRIVATE);
        editor = pref.edit();

        if(convertView==null){
            convertView = lif.inflate(layout, parent, false);

            viewHolder = new ViewHolder();

            viewHolder.textTitle =  convertView.findViewById(R.id.texttitle);
            viewHolder.ck = convertView.findViewById(R.id.ck);

            convertView.setTag(viewHolder);

        }
        else
        {
            viewHolder = (ViewHolder)convertView.getTag();
        }

        viewHolder.textTitle.setText(arr.get(position).getText());
        viewHolder.ck.setText(arr.get(position).getText2());
        viewHolder.ck.setChecked(arr.get(position).getCk());

        viewHolder.ck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
               // viewHolder.ck.setChecked(!viewHolder.ck.isChecked());
                if(viewHolder.ck.isChecked()){
                    editor.putBoolean(arr.get(position).getText(),true);
                }
                else{
                    editor.putBoolean(arr.get(position).getText(),false);
                }
                editor.commit;
                if(pref.getBoolean(arr.get(position).getText(),false)){
                    viewHolder.ck.setChecked(true);
                }else{
                    viewHolder.ck.setChecked(false);
                }
            }
        });



        return convertView;
    }

    private class ViewHolder{
        TextView textTitle;
        CheckBox ck;

    }
}


어레이리스트 안에 appVo는 String text, String text2, boolean ck 이렇게 3개 들어있습니다...

 if(pref.getBoolean(arr.get(position).getText(),false)){
                    viewHolder.ck.setChecked(true);
                }else{
                    viewHolder.ck.setChecked(false);
                }

이 부분을 onCheckedChangeListner 안에 넣으면 체크를 해도 바로 풀려버리고

바깥으로빼면 체크는 되는데 스크롤 조금만 하면 체크가 풀리네요 ㅠㅠ

게다가 체크가 된상태로 스크롤 안하고 나갔다 들어오면 pref에 저장된 값을 제대로 받아와서

체크가 되어있는데 스크롤하면 체크가 풀려버립니다...



0
0
  • 답변 1

  • UnknownDontknow
    197
    2019-01-01 19:42:07

    http://chan180.tistory.com/102

    체크상태를 저장하는 리스트나 배열 객체가 따로 있어야 하는것으로 알고있어요. 위 링크를 참고하셔서 코드 변경해보세요. 

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.