FrameLayout画面を左側のナビゲーション パネルと右側のコンテンツ パネルに分割して使用するメイン アクティビティがあります。左側のパネルはナビゲーションに使用され、さまざまなレイアウトを右側のパネル ( と呼ばれるcontentLayout) にロードします。右側のパネルには、複数のレイアウトを接着することができます。ListView左側のナビゲーション パネルにonItemClickListeners があります。別々の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を膨張させます。はスタイル ビューです。つまり、各リスト項目の右側にラジオ ボタンのようなアイコンが表示されます。ThirdClassLayoutListViewcommonListViewArrayAdapter<String>ListViewlistChoiceIndicatorSingle
アプリが起動すると、右側のコンテンツ パネルは空です。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番目のレイアウトと一致させることはできませんでした。誰もそのような問題に遭遇しましたか? これを修正または回避する方法を知っている人はいますか?