2013-12-20 113 views
48

android应用程序中,我将Db中的数据加载到Fragment中的TableView中。但是当我Reloadfragment它显示以前的数据。我可以使用当前数据而不是以前的数据重新填充Fragment吗?重新加载时刷新片段

+0

请给我们一些代码。你在哪里加载你的数据,你在哪里开始你的片段,你在哪里存储你的值? –

+0

这应该解决你porly描述的问题:http://stackoverflow.com/questions/6503189/fragments-onresume-from-back-stack –

+0

请提供更多的信息代码段 – nikvs

回答

132

我想你想刷新在DB更新片段内容

如果是这样,分离片段并重新它

// Reload current fragment 
Fragment frg = null; 
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG"); 
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.detach(frg); 
ft.attach(frg); 
ft.commit(); 

Your_Fragment_TAG是你给你的片段,当你创建它的名字

此代码用于支持库。

如果你不支持较旧的设备,只是用getFragmentManager代替getSupportFragmentManager

[编辑]

此方法需要片段的有一个标签。
如果你没有它,那么@ Hammer的方法就是你所需要的。

+2

这给了以下错误 - java.lang.RuntimeException:失败传递结果ResultInfo {who = null,request = 2,result = 3,data = null}到活动{xont.virtusel.v4.controller/xont.virtusel.v4.controller.sale.InvocieBrandActivity}:java.lang.IllegalStateException:Can not在onSaveInstanceState后执行此操作 –

+0

我称这个@ onActivityResult。 –

+0

那么,在onActivityResult中调用它有意义吗?看起来你的意图是空的(你看到:data = null)。我这样做:我更新我的数据库,并在我分离/重新附加我的片段后。 –

20

如果你没有片段标签,下面的代码适合我。

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container); 
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") { 
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction(); 
fragTransaction.detach(currentFragment); 
fragTransaction.attach(currentFragment); 
fragTransaction.commit();} 
} 
+1

什么是片段ID,我没有在任何地方声明片段ID。如何以及在哪里申报? – NarendraJi

+0

似乎无法在我的Activity中使用'getActivity()'。我应该使用'Activity.this ...'吗? – Si8

83

这将刷新当前片段:

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.detach(this).attach(this).commit(); 
+1

在哪里放这个代码?内部活动或片段本身? – NarendraJi

+2

你把它放在需要刷新的片段中。 –

+1

这是正确的答案。容易和(几乎)总是工作。 – VSG24

0

使用ContentProvider并加载使用 'CursorLoader' 的数据。有了这种架构,您的数据将自动重新加载数据库更改。使用third-party frameworksContentProvider - 你真的不希望自己去实现它...

0
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG); 
     getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit(); 

如果u使用FragmentManager初始化片段,这只会工作。如果你使用XML作为<fragment ... />,它不会再次调用onCreateView。浪费了我30分钟的时间来解决这个问题。

+0

你是如何解决这个问题的? – visoft

0

我有同样的问题,但以上都没有为我的工作。要么有一个堆栈中的问题(加载后,当用户按下回它会再去相同片段),或者它没有调用onCreaetView

最后我做到这一点:

public void transactFragment(Fragment fragment, boolean reload) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    if (reload) { 
     getSupportFragmentManager().popBackStack(); 
    } 
    transaction.replace(R.id.main_activity_frame_layout, fragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

好的一点是你不需要片段的标签或ID。 如果你想重装

1
getFragmentManager().beginTransaction().detach(this).attach(this).commit(); 
+1

请提供您的回答,并提供明确的描述。不要编写代码,给出关于您共享的代码的解释,以便其他人也可以理解,这会有所帮助。我请求你阅读FAQ部分,以便有效地使用Stack Overflow。 –

0

protected void onResume() { super.onResume(); viewPagerAdapter.notifyDataSetChanged(); }

不要写viewpagerAdapter.notifyDataSetChanged();在MainActivity中的onResume()中。 祝你好运:)