1

私の Android プロジェクトには、2 つのフラグメントで作成されたマスター/詳細ビューを使用するアクティビティがあります。私のdetailfragmentは私にいくつかの「問題」を与えています。

50 以上のコントロール (TextViews、EditTexts、CheckBoxes、Spinner) で構成されています。この 50 以上のコントロールのうち、detail-fragment 内の 32 のコントロールへの参照をプログラムで取得し、それらのデータを SQLite データベースからロードします。

これを実行し、使用してコントロールを初期化すると

(SomeControl).findViewById(R.id.mycontrol);

LogCat は、メイン スレッドでやりすぎている可能性があることを警告し続けます。

findViewById とビューの膨張はコストのかかる操作であることを知っているので、アイデアがありました!

ListFragment で行っているように、detail-fragment でビューホルダー パターンまたはビュー リサイクルを使用する方法があるかどうか疑問に思っていました。そうすれば、ListView で別のアイテムを選択するたびに詳細ビューを再初期化することを避けることができます。そして、私と同じように .findViewById を呼び出さないでください。誰かがこのようなものを実装する方法について考えを持っていますか? detailsfragment の onCreate メソッドでコントロールの初期化を行った場合、違いはありますか? また、詳細フラグメントを「シングルトン」にして、リストフラグメントの選択が変更されたときに getLoaderManager().restartLoader を使用することも考えていました。このすべてについての考えは非常に高く評価されます。

4

2 に答える 2

0

解決策を見つけました。ただし、実装を完全に変更する必要がありました。

現在、私の実装では、ListFragment と DetailFragment の両方でローダーを使用しています。

私が行った変更のリストは次のとおりです。

  1. 1 つのメソッド (onSomethingClicked(SomeObject obj)) を使用して ListFragment のインターフェイスを作成し、このインターフェイスを介して ListFragment を監視できるようにしました。
  2. DetailFragment にインターフェイスを実装し、ListFragment にリスナーを登録しました。
  3. DetailFragment にメソッド onSomethingClicked() を実装しました。これがトリガーされると、ListFragment から DetailFragment にデータを渡し、DetailFragment ローダーを再起動して、OnLoadFinished で既に初期化されているコントロールにデータをロードします。

リスト内の選択が変更されるたびにビューを膨らませる必要はなく、.findViewById の必要もなく、最も重要なことに、Choreographer の警告はもうありません :)

于 2013-09-03T12:53:02.560 に答える
0

各コントロールにまったく同じレイアウトを使用していない限り、それを行う方法があるかどうかはわかりません。

しかし、問題を解決する方法があるかもしれません: AsyncTask を使用することです。

プログラムがデータを処理するためにこれらのコントロールが必要ない限り (そして、あなたの説明から、ユーザーが操作するまで UI 要素がトリガーされるとは思わない)、問題なく、メイン スレッドは解放されます。必要なことは何でもする。この方法で私が目にする唯一の欠点は、一部の UI 要素がおそらく 0.5 秒遅れて表示される可能性があることです (考えてみればそれほど悪くはありません)。

于 2013-09-02T21:31:40.480 に答える