FrameLayout
画面を左側のナビゲーション パネルと右側のコンテンツ パネルに分割して使用するメイン アクティビティがあります。左側のパネルはナビゲーションに使用され、さまざまなレイアウトを右側のパネル ( と呼ばれるcontentLayout
) にロードします。右側のパネルには、複数のレイアウトを接着することができます。ListView
左側のナビゲーション パネルにonItemClickListener
s があります。別々のonItemClick
方法で、次contentLayout.removeAllViews()
のようにレイアウトを使用して膨張させます。
private final OnItemClickListener redListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
contentLayout.removeAllViews();
if (myFirstClassLayout == null) {
myFirstClassLayout = FirstClassLayout.getLayout(
layoutInflater,
MyActivity.this,
resources,
new ArrayList<String>(),
new ArrayList<Desc>()
);
}
CommonClass.updateListeners();
if (FirstClassLayout != null) contentLayout.addView(myFirstClassLayout);
}
};
private final OnItemClickListener blueListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
contentLayout.removeAllViews();
if (mySecondClassLayout== null) {
mySecondClassLayout = SecondClassLayout.getLayout(
layoutInflater,
MyActivity.this,
resources,
new ArrayList<String>(),
textList,
new ArrayList<Desc>(),
hash
);
}
CommonClass.updateListeners();
if (SecondClassLayout != null) contentLayout.addView(mySecondClassLayout);
}
};
との両方で、FirstClassLayout
を使用するダイナミック( と呼びましょう) を含む aSecondClassLayout
を膨張させます。はスタイル ビューです。つまり、各リスト項目の右側にラジオ ボタンのようなアイコンが表示されます。ThirdClassLayout
ListView
commonListView
ArrayAdapter<String>
ListView
listChoiceIndicatorSingle
アプリが起動すると、右側のコンテンツ パネルは空です。redListener
またはをトリガーすると、右側のコンテンツ パネルにリスト項目が選択されていない状態で が表示されますblueListener
。commonListView
最初に赤をトリガーし、次に青をトリガーし、次に で選択するcommonListView
と、変更が に反映されますFirstClassLayout
。これは素晴らしいことです。ただし、commonListView
その FirstClassLayout から別のものを選択して続行し、 をトリガーしblueListener
て に移動すると、 に行っSecondClassLayout
た選択が反映さcommonListView
れSecondClassLayout
ません。代わりに、最後に を使用したときに選択した項目で停止しますSecondClassLayout
。
これは、テストを逆の順序で実行した場合に発生するため、最後にトリガーしたリスナーに応じて、最後のリスナーとレイアウトが両方のレイアウトに対して適切な UI 同期制御を行います。私が最初にトリガーしたものは、自分自身を制御することしかできないようです. 両方のリスナーが、ListView
選択された同じ項目を両方のレイアウトでいつでも表示できるようにする必要があります。
commonListView
最後のレイアウトから最初のレイアウトへの同期は、次の方法で実現さCommonClass.updateListeners()
れます。
adapter.clear();
for (String title: statusSet) adapter.add(title);
adapter.notifyDataSetChanged();
commonListView.setItemChecked(positionOfItemChecked, true);
Log.i(TAG, "position checked = " + positionOfItemChecked);
adapter.notifyDataSetChanged();
これは最後にトリガーされたレイアウトから最初に機能するため、これは UI の更新の問題に関連しているに違いないと考えていますが、あらゆる場所で適切な解決策を探し、すべての提案を試しました。Log.i
ステートメントは、トリガーされた最初または最後のレイアウトで正しく出力されるためLogCat
、コードに適切にヒットしていることがわかります。最初のものが最後のものを制御できない理由がわかりません。私はもう試した:
commonListView.invalidate();
((BaseAdapter) commonListView.getAdapter()).notifyDataSetChanged();
他にAsyncTask
もいくつかありましたが、最初のレイアウトを更新して2番目のレイアウトと一致させることはできませんでした。誰もそのような問題に遭遇しましたか? これを修正または回避する方法を知っている人はいますか?