관계, Networking 그리고 Programming

GridView와 ViewHolder

androbook 본캐 2014. 9. 19. 14:44

아오 마음 속 깊은 곳으로부터의 빡침을 느끼며... 나 이런 험한 말 자꾸 쓰면 안되는데, 쓸데없는 삽질을 연 이틀 하고 나니 마음에서 욕이 우러나옴...-_- 으아랏!!!


현재 개발 중인 프로그램 내에 GridView를 사용할 일이 생겼다. 음 일반적으로 리사이클을 위해 사용하는 ViewHolder 형식을 활용했다.


그런데 이노무 것이. 자꾸 첫 번째 칸이 안 나와. 왜. 어째서. 와이. 나니데. 나제. 왓. 시험 삼아 ViewHolder 재활용을 안 하고 매번 new로 만들어주니 문제가 생기지 않는다. 그러니까 ViewHolder 재활용 중에 생기는 문제란 말이지. 근데 어째서 생기는 거냐고. 크흡. 구글링을 시작했는데, 비슷한 질문이 가끔 보인다. 그런데 뭔가 명확한 답이 없다. 그러던 중 어떤 답변에 이게 있었다.


I had the exact same problem and fixed it by removing/modifying GridView.LayoutParams.


어엉? 정말? 시험삼아 해본다.


기존 코드


@Override

public View getView(int position, View convertView, ViewGroup parent) {

View v = convertView;

        

       if(v == null){

           viewHolder = new ViewHolder();

...

v.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

   v.setTag(viewHolder);

}

else {

   viewHolder = (ViewHolder)v.getTag();

 ...

}

...


수정 코드


@Override

public View getView(int position, View convertView, ViewGroup parent) {

View v = convertView;

        

       if(v == null){

           viewHolder = new ViewHolder();

...

v.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

    v.setTag(viewHolder);

}

else {

v.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

    viewHolder = (ViewHolder)v.getTag();

 ...

}

...


수정 하고 나서 빌드해서 돌려보니, 첫번째 칸이 이상 없이 잘 나온다. 얼쑤 절쑤 ㅠㅠㅠ 덩더쿵덩기덕쿵덕짜랍자아ㅓ라ㅓㅏㅓ냐....?...


왜 ViewHolder 재활용 중에 이런 문제가 생기는 지는 안드로이드 코드를 붙여서 분석해봐야 알겠지만, 일단... 하아.. 삽질을 멈추고 다음 코딩으로 넘어갑시다. 답변 주신 분 감사합니다. 스택오버플로우 알럽유.