Java 包含ListView的选项卡片段在第二次选中时为空
我的应用程序有一个实现TablListener类的主活动。在其中,我可以在5个选项卡之间切换。以下是我在主要活动中如何处理此问题:Java 包含ListView的选项卡片段在第二次选中时为空,java,android,listview,android-fragments,android-listview,Java,Android,Listview,Android Fragments,Android Listview,我的应用程序有一个实现TablListener类的主活动。在其中,我可以在5个选项卡之间切换。以下是我在主要活动中如何处理此问题: @Override protected void onCreate(Bundle p_SavedInstanceState) { super.onCreate(p_SavedInstanceState); setContentView(R.layout.main_fragment_activity); m_User = (User) get
@Override
protected void onCreate(Bundle p_SavedInstanceState)
{
super.onCreate(p_SavedInstanceState);
setContentView(R.layout.main_fragment_activity);
m_User = (User) getIntent().getExtras().getSerializable("User");
if(m_ActionBar == null)
m_ActionBar = getSupportActionBar();
if(m_ActionBar.getTabCount() == 0)
{
m_ActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab v_TabModules = m_ActionBar.newTab();
v_TabModules.setText(" Modulos");
v_TabModules.setIcon(getResources().getDrawable(R.drawable.ic_menu_copy));
v_TabModules.setTabListener(this);//new NavigationTab(v_FragmentContainer, v_FragmentManager, new ModulesListFragment()));
m_ActionBar.addTab(v_TabModules);
ActionBar.Tab v_TabLocations = m_ActionBar.newTab();
v_TabLocations.setText(" Comodos");
v_TabLocations.setIcon(getResources().getDrawable(R.drawable.ic_menu_home));
v_TabLocations.setTabListener(this);//new NavigationTab(v_FragmentContainer, v_FragmentManager, new LocationsListFragment()));
m_ActionBar.addTab(v_TabLocations);
ActionBar.Tab v_TabScenes = m_ActionBar.newTab();
v_TabScenes.setText("Cenas");
v_TabScenes.setIcon(getResources().getDrawable(R.drawable.ic_menu_crop));
v_TabScenes.setTabListener(this);//new NavigationTab(v_FragmentContainer, v_FragmentManager, new ScenesListFragment()));
m_ActionBar.addTab(v_TabScenes);
ActionBar.Tab v_TabSchedules = m_ActionBar.newTab();
v_TabSchedules.setText("Agendamentos");
v_TabSchedules.setIcon(getResources().getDrawable(R.drawable.ic_menu_schedule));
v_TabSchedules.setTabListener(this);//new NavigationTab(v_FragmentContainer, v_FragmentManager, new ScheduleListFragment()));
m_ActionBar.addTab(v_TabSchedules);
ActionBar.Tab v_TabUser = m_ActionBar.newTab();
v_TabUser.setText("Usuario");
v_TabUser.setIcon(getResources().getDrawable(R.drawable.ic_menu_user));
v_TabUser.setTabListener(this);//new NavigationTab(v_FragmentContainer, v_FragmentManager, new UserFragment()));
m_ActionBar.addTab(v_TabUser);
}
if(p_SavedInstanceState != null)
{
int v_IndexTab = p_SavedInstanceState.getInt("tabIndex");
m_ActionBar.setSelectedNavigationItem(v_IndexTab);
}
else
{
m_ActionBar.setSelectedNavigationItem(0);
}
}
@Override
public void onTabSelected(Tab p_Tab, FragmentTransaction arg1)
{
BaseClassGafitFragment v_Fragment = null;
if(p_Tab.getPosition() == 0)
v_Fragment = new ModulesListFragment();
else if(p_Tab.getPosition() == 1)
v_Fragment = new LocationsListFragment();
else if(p_Tab.getPosition() == 2)
v_Fragment = new ScenesListFragment();
else if(p_Tab.getPosition() == 3)
v_Fragment = new ScheduleListFragment();
else if(p_Tab.getPosition() == 4)
v_Fragment = new UserFragment();
if(v_Fragment != null)
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment_activity, v_Fragment).commit();
}
ModulesListFragment、LocationsListFragment、ScenesListFragment和ScheduleListFragment类在Fragment类的外部,内部有一个ListView。以下是ModuleListFragment如何管理此列表的示例:
@Override
public View onCreateView(LayoutInflater p_Inflater, ViewGroup p_Container,
Bundle p_SavedInstanceState)
{
View v_View = p_Inflater.inflate(R.layout.moduleslist_activity, p_Container);
m_ListView = (ListView) v_View.findViewById(R.id.modules_list_id_list_view);
m_ListView.setOnItemClickListener(onItemClick());
return super.onCreateView(p_Inflater, p_Container, p_SavedInstanceState);
}
@Override
public void onResume()
{
super.onResume();
loadModulesFromCache();
}
private void loadModulesFromCache()
{
ArrayList<AbstractAction> v_ModulesList = new ArrayList<AbstractAction>();
for (Module v_Module : SocketHandlerService.m_Cache.getModulesList())
v_ModulesList.add(v_Module);
for (Waiting v_Waiting : SocketHandlerService.m_Cache.getWaitingList())
v_ModulesList.add(v_Waiting);
ActionListAdapter v_Adapter = new ActionListAdapter(getActivity().getLayoutInflater(), v_ModulesList);
m_ListView.setAdapter(v_Adapter);
}
该应用程序首先是使用一个活动为五个现在是片段的类中的每一个构建的,现在为了使用选项卡,我将它迁移到片段实现。
应用程序运行正常,但当我从一个选项卡切换到另一个选项卡,然后返回到上一个选项卡时,listView就消失了!最后一个没有listView的选项卡工作正常,但其他4个选项卡仅在第一次选中时工作。有人知道会发生什么吗?我发现一些人有类似的问题,但他们的实现似乎与我的不同,而且由于我现在请求处理片段,我无法确定代码中解决问题的内容与我的问题之间的关系。。。
我们非常感谢您的帮助,并将及时提供所需的任何进一步信息!提前感谢所有正在阅读此文章的人 变化
@Override
public View onCreateView(LayoutInflater p_Inflater, ViewGroup p_Container,
Bundle p_SavedInstanceState)
{
View v_View = p_Inflater.inflate(R.layout.moduleslist_activity, p_Container);
m_ListView = (ListView) v_View.findViewById(R.id.modules_list_id_list_view);
m_ListView.setOnItemClickListener(onItemClick());
return super.onCreateView(p_Inflater, p_Container, p_SavedInstanceState);
}
为了
及
为了
使我们的代码工作。非常感谢@Luksprog 我真的怀疑你的代码是否正常工作。在您发布的片段的
onCreateView()
中,您膨胀了一个布局,初始化ListView
引用仅用于放弃所有内容并返回onCreateView()
的super
实现。亲爱的@Luksprog先生,m_ListView是我片段类的私有对象。正如我所说的,它只在我第一次选择一个标签时正常工作。也许我不理解你的设置。但是,你再一次膨胀了布局,你没有从onCreateView()返回它,所以你获取的引用不会产生任何结果。现在我明白你说的@Luksprog!也许这就是我问题的根源,我会解决它,然后把进展公布在这里!谢谢另外,在onTabSelectd()
回调中,使用传入的FragmentTransaction
,不要像当前那样创建自己的事务。也不要提交传入的FragmentTransaction
。
@Override
public View onCreateView(LayoutInflater p_Inflater, ViewGroup p_Container,
Bundle p_SavedInstanceState)
{
View v_View = p_Inflater.inflate(R.layout.moduleslist_activity, p_Container);
m_ListView = (ListView) v_View.findViewById(R.id.modules_list_id_list_view);
m_ListView.setOnItemClickListener(onItemClick());
return super.onCreateView(p_Inflater, p_Container, p_SavedInstanceState);
}
@Override
public View onCreateView(LayoutInflater p_Inflater, ViewGroup p_Container,
Bundle p_SavedInstanceState)
{
View v_View = p_Inflater.inflate(R.layout.moduleslist_activity, p_Container);
m_ListView = (ListView) v_View.findViewById(R.id.modules_list_id_list_view);
m_ListView.setOnItemClickListener(onItemClick());
return v_View;
}
@Override
public void onTabSelected(Tab p_Tab, FragmentTransaction arg1)
{
BaseClassGafitFragment v_Fragment = null;
if(p_Tab.getPosition() == 0)
v_Fragment = new ModulesListFragment();
else if(p_Tab.getPosition() == 1)
v_Fragment = new LocationsListFragment();
else if(p_Tab.getPosition() == 2)
v_Fragment = new ScenesListFragment();
else if(p_Tab.getPosition() == 3)
v_Fragment = new ScheduleListFragment();
else if(p_Tab.getPosition() == 4)
v_Fragment = new UserFragment();
if(v_Fragment != null)
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment_activity, v_Fragment).commit();
}
public void onTabSelected(Tab p_Tab, FragmentTransaction p_FragmentTransaction)
{
BaseClassGafitFragment v_Fragment = null;
if(p_Tab.getPosition() == 0)
v_Fragment = new ModulesListFragment();
else if(p_Tab.getPosition() == 1)
v_Fragment = new LocationsListFragment();
else if(p_Tab.getPosition() == 2)
v_Fragment = new ScenesListFragment();
else if(p_Tab.getPosition() == 3)
v_Fragment = new ScheduleListFragment();
else if(p_Tab.getPosition() == 4)
v_Fragment = new UserFragment();
if(v_Fragment != null)
p_FragmentTransaction.replace(R.id.main_fragment_activity, v_Fragment);
}