안드로이드 개발 질문/답변
(글 수 45,052)
그리드뷰를 통해 달력을 구현하고있는데... 스크롤시 스크롤 상단과 하단으로 튀어나간 부분이 미친듯한 포지션 꼬임을 보였습니다. 펍에 질문결과 convert뷰의 재사용 문제라는 답변을 얻었는데요.
이미지뷰 자체를 커스텀하고 어답터에선 간단하게
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
imageView = new CustomImage(mContext, position, iDate);
} else {
imageView = (CustomImage) convertView;
}
return imageView;
}
요래 쓰고있답니다. 이리저리 찾아보니 뷰홀더를 사용하면 된다던데... 어떻게 적용해야될지 답을 모르겠네요.
큰결심하고 발코딩한 커스텀뷰와 어답터 소스를 올려봅니다. 그냥지나치지 마시고 제발 해결법좀 달아주세요...
이미지뷰 자체를 커스텀하고 어답터에선 간단하게
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
imageView = new CustomImage(mContext, position, iDate);
} else {
imageView = (CustomImage) convertView;
}
return imageView;
}
요래 쓰고있답니다. 이리저리 찾아보니 뷰홀더를 사용하면 된다던데... 어떻게 적용해야될지 답을 모르겠네요.
큰결심하고 발코딩한 커스텀뷰와 어답터 소스를 올려봅니다. 그냥지나치지 마시고 제발 해결법좀 달아주세요...
2011.04.11 17:53:04
글쎄요 포지션 꼬임이 ViewHolder패턴을 안써서 그런건 아닌듯한데 ViewHolder패턴은 findViewById 메서드가 성능상 그다지 좋지 못하기때문에 View의 setTag로 Object 타입 인스턴스를 저장할 수 있다는 점을 이용하여 성능을 올리려고 쓰는 방법입니다. 물론 setTag를 다른 관점으로 이용할 수는 있습니다. 보통 아래와 같은 방법으로 ViewHolder 패턴이 이루어 집니다.
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflater(getContext(), R.layout.item, null);
holder.view1 = convertView.findViewById(R.id.view1);
holder.view2 = convertView.findViewById(R.id.view2);
convertView.setTag(holder); // 뷰는 setTag로 Object타입의 인스턴스를 저장할 수 있음 ViewHolder 패턴을 구성하는 핵심원리
} else {
holder = (ViewHolder) convertView.getTag(); // setTag로 넣어두었던 ViewHolder 인스턴스를 가져온다.
}
// 아래에서 부터 해당 뷰를 홀더에서 꺼내 활용한다.
}
static class ViewHolder {
public View view1;
public View view2;
}
2011.04.11 17:57:28
이 부분만 봐서는 확실하지 않지만 아답터의 concertView를 재사용 때문에 발생하는 문제같네요..
CumstomImage 생성자에 넘겨주는 position이 어떤값인가요..
리스트뷰는 화면에 보여지는 view의 갯수만큼만 생성하고
화면에 보여지지않는 뷰를 재사용하게 됩니다...
else {
imageView = (CustomImage) convertView;
}
그럼 이부분에서 이전의 positon값을 그대로 가지고 있겠죠..
2011.04.11 18:07:30
return imageView 하기전에 imageview.getPosition으로 값을 한번 출력해보세요..
처음 화면에 보여질때는 정상적으로 출력되지만 스크롤하다보면
view와 데이터가 안맞는 경우가 생길겁니다..
2011.04.11 18:10:13
if(convertView == null) {
imageView = new CustomImage(mContext);
} else {
imageView = (CustomImage) convertView;
}
imageView.setPositon(..);
imageView.setIdata(..);
return imageView;
이런식이면 재사용으로 인한 문제는 해결하실수 있을듯 하네요
imageView = new CustomImage(mContext);
} else {
imageView = (CustomImage) convertView;
}
imageView.setPositon(..);
imageView.setIdata(..);
return imageView;
이런식이면 재사용으로 인한 문제는 해결하실수 있을듯 하네요



