Android, ListView 스크롤시 검은색 배경으로 바뀌는 문제 & Selector가 표시되지 않는 경우 연구

출처 : http://chiyo85.tistory.com/27

ListView를 사용하여 목록을 표시할 때, background 색상을 지정하면 스크롤시 화면이 검게 변하는 현상 발생한다. 또한 밝은 색상을 지정한 경우 아래쪽에 fade색상이 검게 보인다.

문제의 원인과 현상에 대해서는 아래의 자료에 잘 나와 있으니 참고하자.
http://developer.android.com/resources/articles/listview-backgrounds.html

* 문제 해결 방법
   - 위 사이트에도 나와 있지만, 결론부터 얘기하면 간단히 ListView의 속성에 
       android:cacheColorHint="#00000000" 혹은 setCacheColorHint(int) 함수를 이용하면 된다.

  - 또 다른 방법으로 android:scrollingCache="false" 를 사용해도 된다.
     하지만 이 방법은 스크롤 위아래 fade color가 짙게 표현되어 별로 보기에 좋지 않다.


이 문제를 해결하면서 발견한 또 한가지 사실이 있다.

ListView 사용시 Selector가 보이지 않는 문제가 발생하는 경우가 있는데,
처음에는 Custom View를 이용하면 Selector가 나타나지 않는다고 생각했다.

하지만 문제의 원인은 Custom View의 background color를 설정한 것에 있었다.

이것은 Selector가 background color를 이용하여 표시하기 때문이 아닌가 생각된다.
android:drawSelectorOnTop="true"로 설정한 경우 Selector는 목록의 모든 부분을 덮지만,
설정되지 않은 경우 List의 내용이 보이기 위해서는 당연히 background color를 변경할 것이다.

그런데 임의로 목록 내용에 background color를 설정한 경우, Selector의 색으로 변경하지 않는 것이다.

이 문제의 해결 방법 또한 위에서 서술한 바와 같다.
List의 목록에 background color를 설정하지 말고 ListView의 속성에 cacheColorHint속성을 이용하면 된다.


코드로 설명하면, main.xml은 ListView를 포함한 화면이고, row.xml이 하나의 행을 표시한다고 할 때,

[main.xml]
...
<ListView
    android:id="@android:id/list"  
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background=#0000FF"
    android:cacheColorHint="#00000000"
/>
...


[row.xml]
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#0000FF"     <!-- background를 지정하면 Selector가 표시되지 않는다 -->
>
    <TextView ...>
</LinearLayout>

위와 같이 ListView에서 background를 지정할 때에는 내용을 표시하는 row.xml에서 지정하지 말고,
ListView의 속성으로 지정한 후 cacheColorHint 옵션을 지정하면 된다.


덧글

댓글 입력 영역