마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

겟뷰 중복호출 및 레이아웃 배치 문제

0 추천
안녕하세요.
 
현재 화면이 
 
에디터텍스트 
광고 
PullToRefresh
리스트뷰
(제일밑에 버튼(더보기)  addFooterView)
광고(리니어레이아웃)
 
위와 같은 형식으로 화면이 구성되어 있습니다.
 
리스트뷰의 사이즈를 필페어런트 로 하지 않으면 겟뷰가 중복호출되는 문제가 있습니다. 
그러나 필페어런트로 하면 제일밑에 광고가 보이지 않고 화면 밖으로 밀려납니다.
 
프레임레이아웃으로 하면 리스트뷰의 제일 밑에 버튼이 가리게되고 
릴리티브로해도 화면 밖으로 밀려나네요.
 
흠... 이런 화면이 대6개되는데 난감하네요. 
 
경험이나 해결하신분 있으시면 조언 부탁드립니다.
감사합니다.
  (11,920 포인트) 님이 2013년 6월 11일 질문

2개의 답변

0 추천
 
채택된 답변
맨위부터 번호를 매겨볼께요
에디터 텍스트가 1번 ~ 맨밑에 광고가 6번입니다.
당연히 가장 바깥쪽 구성은 리니어 레이아웃 수직 구조겠죠 ?
그 안의 구성원 (위에서 1~6번 번호 매김) 들의 폭은 모두 match_parent 일꺼구요 ?
각 구성원들의 높이는 아마도 wrap_content 겠죠 ?
하지만 리스트뷰의 특성상 자신의 높이를 가지고 있지 않기 때문에 wrap_content 를 쓸 수 없습니다

이때 사용하는게 비율인데요.
리스트뷰를 제외한 1,2,3,5,6 구성원의 높이를 wrap_content 로 주고
리스트뷰만 android:layout_height="0dp"  android:layout_weight="1" 속성으로 설정합니다.

리스트뷰를 제외한 구성원들의 본연의 크기를 모두 설정한 나머지 영역을 리스트뷰가 모두 사용하게 됩니다
블랙넥원 (9,600 포인트) 님이 2013년 6월 11일 답변
 님이 2013년 6월 11일 채택됨
답변감사합니다.
말씀하신대로 이제껏 사용해왔습니다.
리스트뷰만 android:layout_height="0dp"  android:layout_weight="1" 속성으로 설정합니다.
와 같이 설정해놓았습니다 그래서 겟뷰가 중복 호출이 되지요;;;;;

다시 확인해보니 화면에 보이는 부분만 두번 호출되고있습니다.
4~5섯줄정도 중복호출되네요.
스크롤할때는 문제없으니 이대로 갈까 생각중입니다. ㅎㅎ

근본적으로 해결방법이 있으면 좋겠습니다만
답변 진심으로 감사드립니다. 도움이 되었습니다.
0 추천
답변 달아주신 내용을 읽어보니 질문속에 문제는 두가지였습니다.

하나는 겟뷰가 중복호출 되는것.

두번째는 리스트뷰를 가득 채우면 맨 밑의 버튼이 사라지게 되는것

이 두가지는 각각의 답변이 필요합니다. 두번째 질문에 대한 답변만 드렸군요

겟뷰는 중복호출되는게 자연스러운 현상입니다.

리스트 뷰 내의 뷰는 모두 재활용 되고있기 때문이죠.. 카운트된 숫자만큼 호출하고 있는데 이를 재활용하기 때문입니다.

각 뷰마다 값을 세팅하므로써 다른 뷰로 설정해야 합니다. (이해가 되실랑가 모르겠네요)

baseAdapter 를 검색어로 검색해보세요
블랙넥원 (9,600 포인트) 님이 2013년 6월 11일 답변
오우 추가 답변 감사합니당...

각 뷰마다 값을 세팅하므로써 다른 뷰로 설정해야 합니다. (이해가 되실랑가 모르겠네요)
흠 잘이해가 안되요 ㅎㅎ

리스트뷰를 필페어런트로 하면 호출은 한번만 일어납니다.
디버그와 로그를 다찍어서 확인했습니다.
중복호출이라 말씀드린건 쓸데없이 같은 행위를 또 하더랍니다 ㅡㅡ.
예를들어 이미지를 표시 한다하면 이미 표시한이미지의 위에다가
다시 표시하기위해 xml을 파싱하고 비트맵을 생성하고 한다는 말씀입니다.
스크롤할때 재활용 되는건 알고 있습니다 그거와는 다른 문제라 생각합니다.

실재로 겟뷰 중복호출이라 구글링하면 꽤 많은 자료가 나옵니다.
거기에 해결법으로 리스트뷰를 필페어런트로 하라는거였지요.
이렇게 하면 신기하게 정말로 한번만 호출됩니다.

그러나 필로 지정하면
리스트뷰의 밑에 있는 광고가 화면밖으로 밀려나기 때문에 질문을
드렸든거였어요 ㅎ

baseAdapter정보 감사합니다.
baseAdapter는 ArrayAdapter의 부모격으로 리스트의 활용에 따라 쓰임이 다른걸로 알고 있습니다.

baseAdapter도 필페어런트로 안하면 중복호출됩니다. 직접 실장해보고 디버그 로그 찍어본 결과입니다.

감사합니당...
추가로 말씀드리면

제가 말씀드린 중복호출은
0 1 2 3 4 5 이렇게 카운터 되서 리스트뷰에 뿌려지면
끝나야 할텐데
다시
0 1 2 3 4 5 이렇게 출력됩니다.  같은값 같은그림이 두번 출력되는격이지요..
말로만설명드려 굉장히 죄송스럽습니다.
관심 답변 감사합니다.
말씀하신대로 같은 질문을 구글링했더니 문제 해결법은 알고계신대로였네요 저는 아직도 그런사례를 겪지 못해봤는데 xml 구조적문제가 원인이었군요
그러니까 리스트뷰의 높이를 설정하는게 문제가 아니라
리스트뷰의 부모 레이아웃의 높이를 설정하는데 있어서 match_parent 를 써줍으로써 해결되는게 맞나요?
만약 그게 맞다면 리스트도 잘 보이고 하단 버튼도 잘 보이는 구조를 만들 수 있을것 같네요...
답변감사합니다.
네 리스트뷰를 부모레이아웃으로 감싸지 않아도 리스트뷰 자체를 필이나 매치 로 해주면 중복호출되지 않습니다. 감싼다고 하면 감싸는 레이아웃도 필을 줄필요가 있더군요...

블랙님께서 말씀하신 android:layout_weight을 쓰면 모든게 다 잘보입니다. 단지 중복호출이 문제가 되는거였습니다.

weight을 쓰지 않고 필을 써서 다잘보이게 하는게 관건이지요 ;;

방법이 발견될때까지 연구해보도록 하겠습니다.
관심가져주셔서 진심으로 감사드립니다.
weight를 써도 list view의 크기가 가변이고 몇번 재계산되어 getview가 몇번을 다시 중복으로 불린다해도  ...(같은 포지션 같은data)
list view의 getview에서 view재활용만 제대로 구현하셨으면 속도나 화면깜박임 같은 문제는 안생깁니다.
그리고 처음 크기가 계산되어서 고정되고 나면  getview중복호출 안되고요..
스크롤등의 runtime중에도 계속 layout height가 변하게 짰으면 그 구조가 문제고요..
...