1. ホーム
  2. アンドロイド

AndroidでListViewのデータが表示されない不具合

2022-02-24 22:26:01

I. はじめに

先日、Bluetooth機器の一覧を表示するためにlistViewを使用しましたが、実行後、何も表示されないことに気づきました。

II. デバッギング

1. カスタムAdapterのオーバーライドのgetViewメソッドにログを追加し、実行後にログが出力されないことを確認し、次のことを示します。 getView メソッドが実行されない を使用します。

2. 2. カスタムアダプタに渡されたデータリストArrayListをチェックし、ArrayListにデータを追加した後にログ印刷を追加し、ログが実行後にデータを印刷できることがわかります、これは次のことを意味します。 ArrayListにデータがある を使用します。

III. 質問

カスタムアダプタにArrayListがデータ付きで渡されるのに、表示されないのはなぜですか?

IV. 分析

listViewとAdapterの関連部分を再確認する

ArrayListのデータセクション。

List<BluetoothDevice> mPairedDevList = new ArrayList<BluetoothDevice>();
List<BluetoothDevice> mNewDevList = new ArrayList<BluetoothDevice>();

Adapterセクションをカスタマイズします。

MyPairedDeviceAdapter mPairedBlueDeviceAdapter = new BlueDeviceAdapter(this,R.layout.device_name_item,mPairedDevList);
MyNewDeviceAdapter mNewBlueDeviceAdapter = new BlueDeviceAdapter(this,R.layout.device_name_item,mNewDevList);

ListView バインディング Adapter セクションです。

ListView mPairedDeviceListView = findViewById(R.id.paired_device_list_view);
ListView mNewDeviceListView = findViewById(R.id.new_device_list_view);
mPairedDeviceListView.setAdapter(mPairedBlueDeviceAdapter);
mNewDeviceListView.setAdapter(mNewBlueDeviceAdapter);

1. 私のコードの3つの部分はすべてonCreateで書かれていて、ArrayListにデータを追加する部分は後から書かれていることがわかり、つまり、私は ArrayListに追加されたデータはListViewに読み込まれない というのは、後から追加したArrayListのデータがListViewに読み込まれないので、後からArrayListに入れたデータが表示されないということです。

2. ArrayListを作成し、データを追加せずにListVIewをバインドした結果、空のArrayListになり、もちろん表示されません。

V. 解決策

(a) ArrayListの内容を変更する必要がない方、つまりListViewのレイアウトの内容が固定されている方の場合

  • まず、空のArrayListに表示するデータを追加します。

  • 次に、データを含む ArrayList オブジェクトを、カスタム MyAdapter の 3 番目のパラメータとして渡します。

  • 最後に、ListView を MyAdapter にバインドします。

// Create the mArrayList object
ArrayList<device> myArrayList = new ArrayList<device>();

//add the data you want to display to the mArrayList
myArrayList.add(device1);
myArrayList.add(device2);

//pass the mArrayList into the MyAdapter object of MyAdapter
MyAdapter myAdapter = new MyAdapter(this,R.layout.xxx,myArrayList);

//bind the ListView to MyAdapter
mListView.setAdapter(myAdapter);

注:この場合、ArrayListを最初に渡さなければなりません。さもなければ、ArrayListは空になり、ListViewレイアウトにデータが存在しなくなります。

(b) ArrayListの内容が変わる場合、つまりListViewレイアウトの内容が変わる場合

  • ArrayLIst にデータが追加されるたびに、カスタムアダプタの notifyDataSetChanged() メソッドをコールします。

公式ドキュメントでは、以下のように説明されています。

<ブロッククオート

基礎となるデータが変更され、そのデータセットを反映する任意のViewが自身を更新する必要があることを、アタッチされたオブザーバに通知します。

のような意味である。

このメソッドが呼ばれるたびに、アダプタに渡されたデータが変更されたかどうかをチェックし、 変更されたデータに関連付けられたビューを適宜更新します。

したがって、カスタム MyAdapter のデータの ArrayList が変更されるたびに、このメソッドを呼び出して、変更されたデータに対応するレイアウトを更新して、更新されたレイアウトを表示します。

// Create the mArrayList object
ArrayList<device> myArrayList = new ArrayList<device>();

//Pass the mArrayList into the MyAdapter object of MyAdapter
MyAdapter myAdapter = new MyAdapter(this,R.layout.xxx,myArrayList);

//bind the ListView to MyAdapter
mListView.setAdapter(myAdapter);

//add data
myArrayList.add(device1);
myArrayList.add(device2);

//refresh
MyAdapter.notifyDataSetChanged();

注:notifyDataSetChanged()メソッドは、変更をチェックした後、表示されたデータを再ロードするためにgetViewを呼び出し、ListViewのレイアウトを更新します。

VI. まとめ

ListViewのデータ表示の問題については、個人的には getViewメソッドが呼ばれているか、渡されたデータが空かどうかが表示上の問題の鍵になる ListView に Adapter をバインドする前に、Adapter に渡したデータが空であるかどうかを確認します。空であれば、当然 getView は呼ばれないので、表示されないことになります。

もし間違いがあれば、遠慮なく訂正して勉強してください