최상단

컨텐츠

ListView adapter 오류 : 뒷 부분이 반복된다?

글 정보

Category
프로그래밍노트/Java_Android
2016.10.11 00:34

본문

안드로이드에서 ListView를 사용하던 중에 원하지 않는 결과가 나왔다.



위는 실행시킨 후 정상적인 모습이다. 하지만...



아래쪽으로 스크롤해보니 이상하게 반복되었다.



다시 올려봤다. 뒷부분이 반복되는것 뿐만 아니라 이렇게 데이터가 꼬이기도 한다.

그리고 디자인도 오류다..



위처럼 실행 시킨 코드 중에, Custom Adapter중 getView 함수에 문제가 있었다.
내가 짠 잘못된 커스텀 Adapter의 코드는 다음과 같다. 

@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
if ( convertView == null ) {
LayoutInflater inflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_wordview, parent, false);

ViewHolder vh = new ViewHolder();

vh.korean = (TextView) convertView.findViewById(R.id.korean);
vh.word = (TextView) convertView.findViewById(R.id.wordtx);
vh.hiragana = (TextView) convertView.findViewById(R.id.hiraganatx);

convertView.setTag(vh);

word n = m_List.get(position);
if (n != null) {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.korean.setText(n.korean);
holder.word.setText(n.word);
holder.hiragana.setText(n.hiragana);
}
}



getView 함수 중 convertView라는 것이 있다. 이 convertView는 ListView의 성능 향상을 위해 재활용되기도 한다.

5번째 줄 if 문에서, convertView == null 일 경우 실행하는 코드가 있다. 어플리케이션을 시작하고 나서 이 함수가 처음 실행될 때, convertView는 null이다. 즉 convertView에 view를 추가해 줘야 한다.

그런데, 그 후에는 convertView가 null이 아니다. 내가 저질러버린 실수는 converView가 null인 경우 모든 것을 실행해버리고, 재활용되어 null이 아닌 경우는 아무것도 실행을 하지 않는다.


@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
if ( convertView == null ) {
LayoutInflater inflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_wordview, parent, false);
}
ViewHolder vh = new ViewHolder();

vh.korean = (TextView) convertView.findViewById(R.id.korean);
vh.word = (TextView) convertView.findViewById(R.id.wordtx);
vh.hiragana = (TextView) convertView.findViewById(R.id.hiraganatx);

convertView.setTag(vh);

word n = m_List.get(position);
if (n != null) {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.korean.setText(n.korean);
holder.word.setText(n.word);
holder.hiragana.setText(n.hiragana);
}

단순히 if문을 닫는 위치만 바꾸어 줬다. 






신고

트랙백과 댓글 여닫기

Trackback: 0 Comment: 0

댓글 쓰기

페이징

PREV NEXT

1 ··· 5 6 7 8 9 10 11 12 13 ··· 59

TOP