40

同様に、ListView の ELEMENTS を Fragments にすることもできます。TextView XML を ListView に割り当てて外観を変更できることは知っていますが、フラグメントを ListView に追加することはできますか。

例:フラグメントがあります。この Fragment の XML には、ImageView、いくつかの大きなスタイルの TextView、および小さなスタイルの TextView が含まれています。Fragment クラス コードは Bundle を受け取り、内容に基づいて TextViews と ImageView を適宜設定します。Fragment XML と Fragment コードはどちらも問題なく動作します (個々の Fragment を問題なく表示できます)。前述のフラグメントのリストを表示する FragmentActivity があります。FragmentActivity のビュー内に ListView を設定するために使用しているコードは次のとおりです。

    ArrayList<Fragment> fragList = new ArrayList<Fragment>();
    Fragment fragment = Fragment.instantiate(this, TileItem.class.getName());
    Bundle bundle = new Bundle();
    bundle.putInt("key", 0);
    fragment.setArguments(bundle);
    fragList.add(fragment);

    ArrayAdapter<Fragment> adapter = new ArrayAdapter<Fragment>(this, R.layout.tile_item, fragList);
    listItems.setAdapter(adapter);

これが私の考え方です。インスタンス化されたすべてのビューを保持するために、フラグメントの ArrayList を作成します。次に、フラグメントを作成し、バンドルを作成し、データをバンドルに追加して (フラグメントがデータをビューに正しくマーシャリングできるように)、バンドルをフラグメントに追加し、最後にフラグメントを ArrayList に追加します。その後、ArrayAdapter を作成し、使用する要素レイアウトと、作成したフラグメントのリストを追加します。次に、アダプタから読み取るように ListView を設定します。

このコードを実行している人は誰でも、ArrayAdapter をインスタンス化する NPE @ を取得する可能性があります。何を与える?これは可能ですか?これについて頭を悩ませる前に、誰かが私が時間を無駄にしているのかどうか教えてもらえますか? より良い方法はありますか?私は ScrollView を使用することを考えていましたが、ListView の機能の多くを再実装する必要があり、必要がないときに車輪を再発明するのは嫌いです。

読んでくれた人に感謝します。特に、あなたがそれらを残すことに決めた場合は、あなたの考えに感謝します. 私はこれに対する確立された答えを探してみましたが、私が見つけたように見えるのは、フラグメントの INSIDE 内の ListView の使用に関する質問/Web ページだけです。ListView の要素としてフラグメントを使用しない

編集:以下の提案を取り入れ、さらに調査を開始しました。物事が見える方法から、XMLから構築するだけでなく、フラグメントを膨らませるカスタムアダプターを使用できるはずです(プロセスを説明するより良い方法がないため)ただし、現在の実装では、設定しようとするとNPEがスローされますアダプタ。

これが私のカスタムアダプターコードです(簡潔にするために短縮されています):

public class AdapterItem extends ArrayAdapter<Fragment> {

Context c;
List<Fragment> f;

public AdapterItem(Context c, List<Fragment> f) {
    super(c, R.layout.tile_item, f);
    this.c = c;
    this.f = f;
}

@Override
public View getView(int pos, View v, ViewGroup vg) {
    LayoutInflater i = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    return i.inflate(R.layout.tile_item, vg, false);
}

}

そして、これが私がそれを実装する方法です:

ArrayList<Fragment> fragList = new ArrayList<Fragment>();
    Fragment fragment = Fragment.instantiate(this, TileItem.class.getName());
    Bundle bundle = new Bundle();
    bundle.putInt("key", 0);
    fragment.setArguments(bundle);
    fragList.add(fragment);

    AdapterItem adapter = new AdapterItem(this, fragList);
    adapter.add(fragment);
    listItems.setAdapter(adapter);

数日が経ちましたが、このスレッドは埋もれてしまったと確信しています。ただし、誰かがこれを試してみたいと思っていて、グーグル検索でここに来た場合に備えて、最後の更新を1つ追加すると思いました. したがって、私の実装では、ListView にアダプターが渡されると NPE が発生します。それが間違いなくアダプターであり、ListView がエラーをスローしていないことを理解するのにロケット外科医は必要ありません。私の人生のために、私は理由を理解することはできませんが...

いずれにせよ、私はいくつかのアイデアを持っていると思います。まず、ちょっとした裏話です。しばらく前に、FragmentDialog 内で FragmentTransactions を作成しようとしていました。そうしようとするたびに、NPEを取得しました。最終的に、多くの調査を通じて、その理由は Fragments がインスタンス化される方法に関係していることを発見しました。Fragment が呼び出されると、その親からのコンテキストが必要になります。ダイアログの親はそれを開始したアクティビティであるため、ダイアログ自体は必要な基準を満たしていませんでした。ListView にフラグメントを追加しようとすると、これも当てはまると思います。ListView は Fragment のインスタンス化に関する合意を満たしていないため、NPE がスローされるため、ぶら下がって慣習に戻ります。D@mn...私はこれができることを本当に望んでいました。単純な XML の代わりに Fragments を使用すると、リストの整理/検索が非常に簡単になります。うーん… 誰かが疑問に思っている場合に備えて、それはできないと思います。

4

3 に答える 3

8

ListView にフラグメントを配置すると、複数のコンテナ間でフラグメントを乗算できることを意味するため、これは不可能だと思います。FragmentManager を使用してフラグメントを作成すると、フラグメントに識別子がタグ付けされるため、向きやその他の構成の変更時に簡単に再読み込みおよび再配置できます。また、複数のデバイス構成での使用も促進します。

フラグメントは、実際にはアクティビティのサブセットです。リストの一部としてアクティビティを使用することはありますか? 絶対にありません(答えになるはずです!)!!!

さらに、フラグメントが表示されたり表示されなくなったりするたびにフラグメントを連続して attach() および detach() することはあまり役に立ちません (セルはリサイクルされます)。これらはすべて、ListView で扱うべきではない高価な操作です。リストはすばやくスクロールする必要があります。

コメントに関する会話から、アクティビティ内のビュー セットアップ コードとアダプターを適切に分離して、適切なコードを実現したいと考えていることがわかります。次のいずれかで行います。

  1. クラスをオーバーライドし、Viewそこでカスタム描画とセットアップを行います。
  2. リストが表示する必要があるビューを取り戻すために必要なコンテキストとデータセットを提供する新しいクラスを作成します。これは私が通常行うことです。
  3. Utils クラスを使用して、別の場所でビデオを作成します (ばかげています)。

リストでフラグメントを使用しないでください。彼らが目指しているユースケースではありません。HTH。

于 2013-01-16T23:53:23.053 に答える
4

フラグメントを使用する必要はありません。

カスタム ViewAdapter を作成し、より複雑なレイアウト (または、本当に凝ったものにする必要がある場合は、いくつかのより複雑なレイアウト) を拡張してから、必要に応じてレイアウトのフィールドに入力します。

[余談: コメントで回答した人へ -- 実際に質問に回答している場合は、コメントではなく回答を使用してください! その方がより多くの評判ポイントを獲得できるという理由だけでなら!]

于 2013-03-19T20:46:00.940 に答える