我有一个主要活动,它使用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
and中,我对SecondClassLayout
a 进行膨胀,ThirdClassLayout
其中包含一个使用. 这是一个样式视图,这意味着它在每个列表项的右侧显示一个类似单选按钮的图标。ListView
commonListView
ArrayAdapter<String>
ListView
listChoiceIndicatorSingle
当应用程序启动时,右侧的内容面板是空的。如果我触发redListener
或blueListener
,它将commonListView
在右侧内容面板中显示 ,并且未选择任何列表项。如果我先触发红色,然后触发蓝色,然后在 中进行选择commonListView
,则更改会反映回FirstClassLayout
很棒!但是,当我继续从该 FirstClassLayout 中选择其他内容commonListView
,然后触发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
其他几个,但似乎没有什么可以刷新第一个布局以使其与第二个布局匹配。有没有人遇到过这样的问题?有谁知道如何解决或解决这个问题?