2015년 12월 9일 수요일

[android] ListView CheckBox 스크롤시 문제점

리스트 로우 마다 checkBox 를 넣어야 할때가 있는데 스크롤로 인해 체크된 아이템이 화면 밖으로 나갓다 들어올시 어댑터의 getView 등의 함수(화면을 다시 그리는...)가 호출되면서 체크박스가 제대로 체크가 안되는 경우가 있다.

여러가지 해결방법이 있지만

난 각각의 아이템 객체에 isChecked 변수를 활용해서 해결해 보았다.

AutoCallServiceVo.class

public class AutoCallServiceVo {
String phoneNum;
String phoneName;
String count;
String phoneId;
        //추가된 변수
boolean  isChecked;


//어댑터
AutoCallBaseAdapter.class

public class AutoCallBaseAdapter extends BaseAdapter{

.....


public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub



//
View itemLayout = convertView;

//


//리스너에서 사용할 포지션 변수 (그냥 position 값을 넣으면 컴파일 에러)
final int checkBoxPosition = position;

ViewHolder viewHolder = null;


if(itemLayout == null){

itemLayout = mLayoutInflater.inflate(R.layout.list_view_layout, null);




viewHolder = new ViewHolder();



//viewHolder._id = (TextView)itemLayout.findViewById(R.id._id);
viewHolder.phoneName = (TextView)itemLayout.findViewById(R.id.phoneName);
viewHolder.phoneNum = (TextView)itemLayout.findViewById(R.id.phoneNum);
viewHolder.count = (BackButtonFocusOutEditText)itemLayout.findViewById(R.id.count);
viewHolder.checkBox = (CheckBox)itemLayout.findViewById(R.id.checkbox);



itemLayout.setTag(viewHolder);

//뷰홀더가 정의되어 있을경우 는
}else{

viewHolder = (ViewHolder)itemLayout.getTag();

}

// 데이터를 셋팅한다.
//viewHolder._id.setText(mData.get(position).phoneId);
viewHolder.phoneName.setText(mData.get(position).phoneName);
viewHolder.phoneNum.setText(mData.get(position).phoneNum);
viewHolder.count.setText(mData.get(position).count);




//체크박스 클릭 이벤트
viewHolder.checkBox.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("AutoCallService", "checkClick");

AutoCallServiceVo checkViewItem = (AutoCallServiceVo)getItem(checkBoxPosition);

Log.d("AutoCallService", "checkItem : " + checkViewItem.getPhoneName());

//체크 안되어 있는 경우
if(checkViewItem.isChecked){

mData.get(checkBoxPosition).isChecked = false;

//체크가 되어 있는 경우
}else{

mData.get(checkBoxPosition).isChecked = true;


}
//데이터 변경 알림
notifyDataSetChanged();

}


});


//로우별 isChecked 값에 따른 체크상태를 표시
viewHolder.checkBox.setChecked(mData.get(position).isChecked);


//값이 다 셋팅된 view 객체를 반환한다.
return itemLayout;
}


......


댓글 5개:

  1. 덕분에 잘 해결했습니다. 감사합니다!!

    답글삭제
  2. 감사합니다. 이거 해결하려고 구글링만 몇 시간했는데 여기서 해결했네요ㅠㅠ

    답글삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제

[lunux]리눅스 폴더별 용량 확인

리눅스 폴더별 용량 확인 조회 하고자 하는 디렉토리 리스트가있는 경로로 이동후 du -h --max-depth=1