Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Android ListView 스크롤 시 배경이 검게 변하는 문제 해결 방법

ListView 예제를 살펴보기 전에 ListView가 무엇인지 간단히 알아보겠습니다. ListView는 ArrayList, List 또는 데이터베이스에서 가져온 항목들의 모음을 표시하는 위젯입니다. 주로 항목들을 세로 형태로 나열하며, 사용자는 위아래로 스크롤하고 원하는 항목을 클릭할 수 있습니다.

이 글에서는 ListView를 스크롤할 때 배경이 검은색으로 변하는 문제를 해결하는 간단한 방법을 소개합니다.

문제의 원인

ListView는 스크롤 성능을 최적화하기 위해 캐싱 메커니즘을 사용합니다. 이때 기본적으로 설정된 캐시 색상(검은색)이 스크롤 중에 잠깐 드러나면서 배경이 검게 보이는 현상이 발생합니다. 이를 방지하려면 cacheColorHint 속성을 투명하게 설정해야 합니다.

구현 단계

1단계: 새 프로젝트 생성

Android Studio에서 File ⇒ New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

2단계: 레이아웃 파일 수정

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
   xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:layout_width = "match_parent"
   android:layout_height = "match_parent">
   <LinearLayout
      android:layout_width = "match_parent"
      android:layout_height = "match_parent"
      android:orientation = "vertical">
      <ListView
         android:id = "@+id/list"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:cacheColorHint = "#00000000"/>
   </LinearLayout>
</android.support.constraint.ConstraintLayout>

위 코드에서 ListView를 선언했습니다. 스크롤 시 배경이 검은색으로 변하는 것을 방지하려면 아래와 같이 cacheColorHint 속성을 반드시 추가해야 합니다.

<ListView
   android:id = "@+id/list"
   android:layout_width = "wrap_content"
   android:layout_height = "wrap_content"
   android:cacheColorHint = "#00000000"/>

cacheColorHint = "#00000000" 값은 완전한 투명(transparent)을 의미하며, 이렇게 설정하면 스크롤 중에도 원래 배경색이 그대로 유지됩니다.

3단계: MainActivity 작성

src/MainActivity.java 파일에 아래 코드를 추가합니다.

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final ListView list = findViewById(R.id.list);
      ArrayList<String> arrayList = new ArrayList<>();
      arrayList.add("JAVA");
      arrayList.add("ANDROID");
      arrayList.add("C Language");
      arrayList.add("CPP Language");
      arrayList.add("Go Language");
      arrayList.add("AVN SYSTEMS");
      arrayList.add("JAVA");
      arrayList.add("ANDROID");
      arrayList.add("C Language");
      arrayList.add("CPP Language");
      arrayList.add("Go Language");
      arrayList.add("AVN SYSTEMS");
      arrayList.add("JAVA");
      arrayList.add("ANDROID");
      arrayList.add("C Language");
      arrayList.add("CPP Language");
      arrayList.add("Go Language");
      arrayList.add("AVN SYSTEMS");
      arrayList.add("JAVA");
      arrayList.add("ANDROID");
      arrayList.add("C Language");
      arrayList.add("CPP Language");
      arrayList.add("Go Language");
      arrayList.add("AVN SYSTEMS");
      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
      list.setAdapter(arrayAdapter);
      list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String clickedItem = (String) list.getItemAtPosition(position);
            Toast.makeText(MainActivity.this, clickedItem, Toast.LENGTH_LONG).show();
         }
      });
   }
}

MainActivity에서는 리스트 항목들을 ArrayList에 저장한 후, 아래와 같이 어댑터를 통해 ListView에 연결합니다.

ArrayAdapter <String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
list.setAdapter(arrayAdapter);

또한 리스트 항목을 클릭했을 때 해당 항목의 이름을 표시하기 위해 OnItemClickListener를 아래와 같이 등록합니다.

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      String clickedItem = (String) list.getItemAtPosition(position);
      Toast.makeText(MainActivity.this, clickedItem, Toast.LENGTH_LONG).show();
   }
});

앱 실행 및 결과 확인

Manifest 파일은 별도로 수정할 필요가 없습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정하고 앱을 실행해 보겠습니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행 옵션에서 자신의 모바일 기기를 선택하면 기기 화면에 기본 화면이 표시됩니다.

Android ListView 스크롤 시 배경이 검게 변하는 문제 해결 방법

이제 ListView를 스크롤해 보세요. 아래 이미지처럼 배경 색상 문제 없이 정상적으로 동작하는 것을 확인할 수 있습니다.

Android ListView 스크롤 시 배경이 검게 변하는 문제 해결 방법