android 刷新加载,android - 重新加载时刷新片段

android - 重新加载时刷新片段

在Android应用程序中,我将数据从Db加载到Fragment内的TableView。但是当我重新加载Fragment时,它会显示以前的数据。 我可以用当前数据而不是以前的数据重新填充Fragment吗?

12个解决方案

180 votes

我想你想在db update上刷新片段内容

如果是这样,请分离片段并重新连接

// 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

[编辑]

此方法要求Fragment具有标记。

如果您没有它,那么@ Hammer的方法就是您所需要的。

Fantômas answered 2019-09-14T01:41:31Z

126 votes

这将刷新当前片段:

FragmentTransaction ft = getFragmentManager().beginTransaction();

if (Build.VERSION.SDK_INT >= 26) {

ft.setReorderingAllowed(false);

}

ft.detach(this).attach(this).commit();

Mbengue Assane answered 2019-09-14T01:41:56Z

27 votes

如果您没有片段标记,以下代码适用于我。

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

}

Hammer answered 2019-09-14T01:42:20Z

4 votes

您可以在用户看到片段时刷新片段,只需将此代码添加到Fragment中,这将在片段可见时刷新它。

@Override

public void setUserVisibleHint(boolean isVisibleToUser) {

super.setUserVisibleHint(isVisibleToUser);

if (isVisibleToUser) {

// Refresh your fragment here

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

Log.i("IsRefresh", "Yes");

}

}

Kaushik Khambhadiya answered 2019-09-14T01:42:46Z

3 votes

在将片段附加到活动时,您无法重新加载该片段,您将获得“Fragment Already Added”异常。

因此片段必须首先与其活动分离然后附加。 所有这些都可以使用流畅的api在一行中完成:

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

更新:这是为了纳入对API 26及更高版本所做的更改:

FragmentTransaction transaction = mActivity.getFragmentManager()

.beginTransaction();

if (Build.VERSION.SDK_INT >= 26) {

transaction.setReorderingAllowed(false);

}

transaction.detach(this).attach

(this).commit();

有关更新的更多说明,请参阅[https://stackoverflow.com/a/51327440/4514796]

Ali Nem answered 2019-09-14T01:43:32Z

3 votes

要刷新片段,以上所有答案都不适用于Oreo及以上版本。 为了使它适用于所有操作系统,您可以执行以下操作。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

fragmentManager.beginTransaction().detach(this).commitNow();

fragmentManager.beginTransaction().attach(this).commitNow();

} else {

fragmentManager.beginTransaction().detach(this).attach(this).commit();

}

Sachin Jagtap answered 2019-09-14T01:43:58Z

2 votes

MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);

getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();

这只有在您使用FragmentManager初始化片段时才有效。 如果您将其作为XML格式的,则不会再次调用onCreateView。 浪费了我的30分钟来解决这个问题。

Irshu answered 2019-09-14T01:44:24Z

0 votes

使用ContentProvider并使用'CursorLoader'加载数据。 使用此架构,您的数据将在数据库更改时自动重新加载。 使用第二方框架为您的ContentProvider - 您真的不想自己实现它...

artkoenig answered 2019-09-14T01:44:52Z

0 votes

我遇到了同样的问题,但上述情况都没有。 要么有一个后端问题(在用户按下后加载它会再次进入相同的片段)或者它没有调用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。如果你想重装

Emad answered 2019-09-14T01:45:35Z

0 votes

这里我做了什么,它对我有用,我使用firebase,当用户登录时,我想首先刷新当前片段,你需要从活动中重新获取上下文,因为片段没有办法获取上下文,除非你在这里设置它来自Activity或context 是我使用和使用kotlin语言的代码,我认为你可以在java类中使用相同的代码

override fun setUserVisibleHint(isVisibleToUser: Boolean) {

super.setUserVisibleHint(isVisibleToUser)

val context = requireActivity()

if (auth.currentUser != null) {

if (isVisibleToUser){

context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()

}

}

}

hardiBSalih answered 2019-09-14T01:46:04Z

-1 votes

protected void onResume() {

super.onResume();

viewPagerAdapter.notifyDataSetChanged();

}

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

Handy Kim answered 2019-09-14T01:46:32Z

-1 votes

最简单的方法

创建一个包含viewpager.setAdapter的公共静态方法

make adapter和viewpager static

public static void refreshFragments(){

viewPager.setAdapter(adapter);

}

呼叫任何地方,任何活动,任何片段。

MainActivity.refreshFragments();

ryan christoper lucasan answered 2019-09-14T01:47:18Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值