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);
    }
};

FirstClassLayoutand中,我对SecondClassLayouta 进行膨胀,ThirdClassLayout其中包含一个使用. 这是一个样式视图,这意味着它在每个列表项的右侧显示一个类似单选按钮的图标。ListViewcommonListViewArrayAdapter<String>ListViewlistChoiceIndicatorSingle

当应用程序启动时,右侧的内容面板是空的。如果我触发redListenerblueListener,它将commonListView在右侧内容面板中显示 ,并且未选择任何列表项。如果我先触发红色,然后触发蓝色,然后在 中进行选择commonListView,则更改会反映回FirstClassLayout很棒!但是,当我继续从该 FirstClassLayout 中选择其他内容commonListView,然后触发blueListener转到 时SecondClassLayoutcommonListView中的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其他几个,但似乎没有什么可以刷新第一个布局以使其与第二个布局匹配。有没有人遇到过这样的问题?有谁知道如何解决或解决这个问题?

4

2 回答 2

0

添加视图后查看 contentLayout.requestLayout() 是否可以解决您的问题。

于 2012-07-31T05:37:18.860 回答
0

我弄清楚是什么导致第二个占据了第一个。我继承了很多这段代码,所以我对所有部分都不熟悉。涉及其他几件。我终于找到了原作者使用实现自定义侦听器的自定义 AdapterWrapper 的代码部分。ThirdClassLayout 仅通过检查静态 ArrayAdapter 是否为空来创建一个新的 ArrayAdapter 和一个新的 AdapterWrapper。删除此检查允许为两种布局创建新的适配器对象。创建了自己的侦听器后,两种布局现在都会响应。

于 2012-08-07T19:45:19.597 回答