0

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またはをトリガーすると、右側のコンテンツ パネルにリスト項目が選択されていない状態で が表示されますblueListenercommonListView最初に赤をトリガーし、次に青をトリガーし、次に で選択するcommonListViewと、変更が に反映されますFirstClassLayout。これは素晴らしいことです。ただし、commonListViewその FirstClassLayout から別のものを選択して続行し、 をトリガーしblueListenerて に移動すると、 に行っSecondClassLayoutた選択が反映さcommonListViewSecondClassLayoutません。代わりに、最後に を使用したときに選択した項目で停止します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番目のレイアウトと一致させることはできませんでした。誰もそのような問題に遭遇しましたか? これを修正または回避する方法を知っている人はいますか?

4

2 に答える 2

0

2番目のものが1番目に定着する原因を突き止めました。私はこのコードの多くを継承しているため、すべての部分に精通しているわけではありません。他にもいくつかの作品が含まれていました。最終的に、元の作成者がカスタム リスナーを実装するカスタム AdapterWrapper を使用したコードの部分を見つけました。ThirdClassLayout は、静的な ArrayAdapter が null かどうかを確認することによって、新しい ArrayAdapter と新しい AdapterWrapper を 1 回だけ作成していました。このチェックを削除すると、両方のアダプタ オブジェクトを両方のレイアウトで新しく作成できました。独自のリスナーが作成されると、両方のレイアウトが応答するようになります。

于 2012-08-07T19:45:19.597 に答える
0

ビューを追加した後に contentLayout.requestLayout() で問題が解決するかどうかを確認してください。

于 2012-07-31T05:37:18.860 に答える