同様に、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 を使用すると、リストの整理/検索が非常に簡単になります。うーん… 誰かが疑問に思っている場合に備えて、それはできないと思います。