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 は呼ばれないので、表示されないことになります。
もし間違いがあれば、遠慮なく訂正して勉強してください
関連
-
解決策 エラーです。jarfile にアクセスできません。\ʕ-̫͡-ʔ
-
Error:Execution failed for task ':app:compileDebugJavaWithJavac' 根本的な解決方法
-
Android フロントカメラのビデオ録画に失敗しました (MediaRecorder: start failed: -19)
-
AndroidでSPAN_EXCLUSIVE_EXCLUSIVEスパンが長さ0にできない場合、EditTextでコンテンツを削除する
-
Androidです。GridViewコントロールの使用
-
Androidのビューの描画処理を完全に説明し、ビュー(II)を理解するために、ステップバイステップであなたを取る
-
app'の実行エラーです。ターゲットデバイスが見つかりませんでした。
-
開始します。Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.
-
INSTALL_FAILED_INVALID_APK: 分割された lib_slice_5_apk が複数回定義されている 例外
-
Androidエラー:このターゲットで使用できるCPU/ABIシステムイメージがありません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
adb connect device offline エラー解決
-
Eclipse パッケージエクスプローラーの開き方
-
JSONException: java.lang.String は JSONObject ソリューションに変換できません。
-
Androidリストウィジェット開発詳細
-
Manifest merger failed : Android 12以降をターゲットとするアプリは、明示的な指定が必要です。
-
android ImageViewの割り当て問題 setImageResourceとsetImageBitmap
-
Android SpinnerのsetSelectionとonItemSelectedイベントのトリガー順について
-
Android開発用アダプターシリーズ。カスタムアダプタを使ったスピナー
-
Android Studioのインポートプロジェクトが表示されます。ファイルをクランチするのに失敗しました
-
React Native エラー。アプリケーション XXX は登録されていません ソリューション