複数のアクティビティで再利用する複合コントロールを作成しました。このコントロールには多数の TextView と Button が含まれており、最も重要なのは ListView です。レイアウト ファイルで XML を定義し、この複合コントロールのコンストラクターで、XML を次のように拡張します。
String service = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(service);
inflater.inflate(R.layout.map_menu, this, true);
レイアウト XML には ListView が含まれており、コンストラクターでも、この複合コントロールがアダプター (私のアダプターは ArrayAdapter を拡張します) とその配列の設定を処理します。
ListView tableOfContentsList = (ListView) findViewById(R.id.tocListView);
_layerAdapter = new LayerAdapter(context, R.layout.toc_layer_item, _layers);
tableOfContentsList.setAdapter(_layerAdapter);
この複合コントロールは 2 つのアクティビティで使用されます。これらのアクティビティの 1 つは別のアクティビティを呼び出します。2 つのアクティビティ間の関係は意図されていません。
これが私の問題です。複合コントロールが初期アクティビティで作成されると、上記のコードが呼び出されて、このコントロールのアダプターが設定されます。次に、2 番目のアクティビティが作成されてナビゲートされると、このコントロールの 2 番目のインスタンスでコンストラクターが再度呼び出されます。これは、最初のアクティビティにある最初のコントロールに副作用があるようです。2 番目のコントロールは、最初のコントロールのアダプターの一部を上書きしているようです。これは、基本的に、2 番目のコントロールへのコンストラクターが呼び出されると、最初のアダプターが機能しないためです。
両方のコントロールで ListView のリソース ID を参照しているため、Android は 2 番目の ListView が作成されたときに最初の ListView からアダプターを削除していると思います。両方の ListView が同じリソース ID を持つと見なされるためですか? これは可能ですか?
これとまったく同じケースで、複数の複合コントロールが異なるアクティビティで (および単一のアクティビティで複数回) 使用されている場合に、以前に問題が発生しました。この問題は、XML レイアウトからの膨張が原因でした。以前の問題に対する私の解決策は、レイアウトからの膨張を取り除き、代わりにコードを介してオブジェクトを作成することでした。これらの複合コントロールははるかに単純で、ビューが 2 つしか含まれていないため、これは許容されましたが、複合コントロールに少なくとも 10 個のビューが含まれる上記の ListView のケースでは、各ビューをコードで定義することは受け入れられるソリューションではないと感じています。レイアウト XML が必要です。
XML から拡張され、複数のインスタンスで再利用されるカスタム複合コントロールを使用しているときに、この種の衝突動作を経験した人はいますか?