2012-07-30 46 views
0

我有一个使用FrameLayout与屏幕分割成左侧导航和右侧的内容面板主要活动。左侧面板用于导航,将不同的布局加载到右侧面板(称为contentLayout),该面板可以粘贴多个布局。我在onItemClickListener s的左侧导航面板中有ListView。在他们分开onItemClick方法,我用contentLayout.removeAllViews()然后夸大他们的布局,像这样:一个ListView控件,第二布局不更新

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

在这两个FirstClassLayoutSecondClassLayout,我吹一个ThirdClassLayout包含动态ListView(姑且称之为commonListView),使得使用的一个ArrayAdapter<String>ListView是一个listChoiceIndicatorSingle样式视图,这意味着它在每个列表项右侧显示一个类似单选按钮的图标。

当应用程序启动时,正确的内容面板为空。如果我触发了redListenerblueListener,它将在右侧的内容面板中显示commonListView,但未选择任何列表项目。如果我先触发红色,然后触发蓝色,然后在commonListView中进行选择,则更改会反射回FirstClassLayout,这太棒了!然而,当我继续通过选择commonListView从FirstClassLayout别的东西,然后触发blueListenerSecondClassLayout,在SecondClassLayoutcommonListView并不反映我的选择。相反,当我最后一次使用SecondClassLayout时,它卡在我选择的项目上。

出现这种情况,如果我执行相反的顺序测试,所以根据我上次触发该听众,去年听众和布局将有超过两种布局适当的UI synching控制。我首先触发的那个似乎只能控制自己。我需要两个听众能够在任何给定时间在两个布局上显示完全相同的ListView选定项目。

commonListView从去年布局先布局synching通过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刷新问题,但我到处搜寻了一个很好的解决方案并尝试了所有建议。 0123'语句在LogCat中为第一个或最后一个布局触发正确输出,所以我知道它正确地打上了代码。我只是不明白为什么第一个无法控制最后一个。我已经试过:

commonListView.invalidate(); 
((BaseAdapter) commonListView.getAdapter()).notifyDataSetChanged(); 

AsyncTask和其他几个人,但似乎没有什么上刷新的第一个布局,使其第二匹配工作。有没有人遇到过这样的问题?有谁知道如何解决或解决这个问题?

回答

0

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

0

看看contentLayout.requestLayout()将意见解决你的问题了。

+0

我刚刚在contentLayout.addView里面加了同样的if块。在if区块外面试过它。第二个布局的问题仍然不清晰。 – jdynamite 2012-07-31 14:09:59

相关问题