Android
 Computer >> コンピューター >  >> プログラミング >> Android

AndroidでListViewをスクロールすると背景が黒くなる問題の解決方法


まずはListViewについて簡単におさらいしましょう。ListViewとは、ArrayListやList、データベースなどから取得したデータのコレクションを一覧形式で表示するためのViewです。一般的には、複数の項目を縦方向に並べて表示し、上下にスクロールしながら目的の項目をタップして操作するために使われます。

本記事では、ListViewをスクロールした際に背景が黒くなってしまう問題を回避するための、シンプルな解決策を紹介します。

手順1:新規プロジェクトを作成する

Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目を入力して、新しいプロジェクトを作成してください。

手順2:activity_main.xmlにコードを追加する

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を宣言しています。スクロール時に背景が黒くなるのを防ぐには、次のようにListViewに対して「android:cacheColorHint」属性を指定します。

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

「#00000000」は完全な透明色を表す値です。この設定を行うことで、スクロール中のキャッシュ描画領域が透明になり、背景が黒く見える現象を防ぐことができます。

補足: cacheColorHintによる描画最適化は、ハードウェアアクセラレーションが標準になったAndroid 3.0(APIレベル11)以降では基本的に不要となっています。しかし、古いOSバージョンをサポート対象とするアプリでは、今でも有効な対策です。

手順3:MainActivity.javaにコードを追加する

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に格納し、それをArrayAdapter経由でListViewにセットしています。

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

さらに、リスト項目がタップされたときにその項目名をToastで表示できるよう、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();
   }
});

アプリを実行して動作を確認する

マニフェストファイルを変更する必要はありません。実機のAndroidスマートフォンをパソコンに接続したうえで、Android Studioからアプリを実行してみましょう。プロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。実行デバイスとして自分のスマートフォンを選択すると、端末の画面にアプリの初期画面が表示されます。

AndroidでListViewをスクロールすると背景が黒くなる問題の解決方法

この状態でListViewをスクロールしても、以下のように背景色の問題は一切発生しません。

AndroidでListViewをスクロールすると背景が黒くなる問題の解決方法

  1. AndroidでListViewのアイテム背景色を変更する方法【コード例付きで解説】

    この記事では、AndroidアプリでListViewの各アイテムの背景色を変更する方法を、実際のコード例とともにわかりやすく解説します。リストの項目をタップしたときに背景色が変わるシンプルなサンプルアプリを作成しましょう。 手順1:Android Studioで新規プロジェクトを作成 まず、Android Studioを起動し、メニューから「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目をすべて入力し、プロジェクトのセットアップを完了させてください。 手順2:レイアウトファイル(activity_main.xml)にListViewを配置 次に、

  2. AndroidでListViewにカスタムアダプターを追加する方法を徹底解説

    この記事では、AndroidアプリのListViewにカスタムアダプター(BaseAdapter)を実装する方法を、サンプルプロジェクトのコードとともにステップ形式で解説します。リストの各行に「番号」「名前」「電話番号」を表示するシンプルな連絡先リストを作成しながら、カスタムアダプターの基本的な仕組みを学びましょう。カスタムアダプターとは?ListViewは、データの一覧をスクロール可能な形で表示するためのUIコンポーネントです。デフォルトの ArrayAdapter では単純なテキストしか表示できませんが、BaseAdapter を継承したカスタムアダプターを使えば、複数の TextView