gpt4 book ai didi

在 FragmentPagerAdapter 中存储为数组的 Android Fragments 在离开并返回应用程序后未刷新

转载 作者:行者123 更新时间:2023-11-29 16:06:36 24 4
gpt4 key购买 nike

我遇到了一个奇怪的问题, fragment View 没有正确刷新,但它只会在应用程序关闭并在一段时间后重新打开后发生。

我有一个 TabSwitcherActivity,其中包含一个 ViewPagerViewPager 在 3 个 fragment 之间切换,每个 fragment 代表相同信息的不同 View 。某些事件可能会导致信息过时,因此需要通知 fragment 以刷新 View 。为实现这一点,我的 TabSwitcherActivity 有一个名为 notifyDataSetChanged() 的方法,它将迭代 3 个 fragment 并告诉它们刷新。这是(我认为)最相关的代码:

public class TabSwitcherActivity extends FragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Used to keep track of the child fragments of this activity so we can update their list adapters.
mFragments = new ArrayList<Fragment>();

// Set up the view pager and tab adapter.
setContentView(R.layout.pager_layout);
mViewPager = (ViewPager) super.findViewById(R.id.pager);

mFragments.add(Fragment.instantiate(this, FragmentOne.class.getName()));
mFragments.add(Fragment.instantiate(this, FragmentTwo.class.getName()));
mFragments.add(Fragment.instantiate(this, FragmentThree.class.getName()));
mViewPager.setAdapter(new ListPagerAdapter(super.getSupportFragmentManager(), mFragments));
}

public void notifyDataSetChanged() {
for (Fragment fragment : mFragments) {
if (fragment instanceof IDataSetChangedListener) {
((IDataSetChangedListener) fragment).notifyDataSetChanged();
}
}
}
}

现在,首次启动应用程序时,这会按预期工作。问题是应用程序关闭并在一段时间后重新打开后,在应用程序运行时调用 TabSwitcherActivity.notifyDataSetChanged() 不会更新 fragment View (这在应用程序第一次运行时有效)重启后启动)。这让我相信我没有正确处理 fragment 的生命周期情况。知道这可能是什么吗?我突然想到,如果 fragment 被销毁并重新创建,它们可能没有正确存储在我的 mFragments 数组中。

最佳答案

我正在回答我自己的问题,以防其他人遇到与我遇到的问题类似的问题。我能够根据 invertigo 的评论解决问题。我将发布代码重要部分的一些通用 fragment 。

正如我所怀疑的,存储在数组中的 fragment 如果被应用程序销毁并重新创建则没有正确更新。 (这有时会在应用程序关闭并重新打开时发生。)删除数组有点棘手,因为我使用它来存储我的 FragmentPagerAdapter 实现中选项卡的 fragment 。

这是我的旧 ListPagerAdapter 类:

public class ListPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragments;

public ListPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
mFragments = fragments;
}

@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}

@Override
public int getCount() {
return mFragments.size();
}

@Override
public String getPageTitle(int position) {
return ((ITitledFragment) mFragments.get(position)).getTitle();
}
}

这是我的新实现,它消除了由包含错误 fragment 引用的数组引起的问题:

public class ListPagerAdapter extends FragmentPagerAdapter {    
private static final int FRAGMENT_ONE_POSITION = 0;
private static final int FRAGMENT_TWO_POSITION = 1;
private static final int FRAGMENT_THREE_POSITION = 2;
private static final int COUNT = 3;

public ListPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int position) {
switch (position) {
case FRAGMENT_ONE_POSITION:
return new FragmentOne();
case FRAGMENT_TWO_POSITION:
return new FragmentTwo();
case FRAGMENT_THREE_POSITION:
return new FragmentThree();
}
return null;
}

@Override
public int getCount() {
return COUNT;
}

@Override
public String getPageTitle(int position) {
switch (position) {
case 0:
return FragmentOne.getTitle();
case 1:
return FragmentTwo.getTitle();
case 2:
return FragmentThree.getTitle();
}
return null;
}
}

然后,唯一剩下的问题是如何让我的 TabSwitcherActivity 类更新所有过时的 fragment 。正如 invertigo 指出的那样,这可以通过标签来完成。但是,我决定使用一种方法,其中每个 fragment 在创建时都将自己注册到 Activity 中,并在销毁之前注销自己。该 Activity 可以迭代已注册的 fragment 以更新它们。

来自TabSwitcherActivity的相关代码:

class TabSwitcherActivity extends FragmentActivity {
private List<Fragment> mFragments;

private void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Used to keep track of the child fragments of this activity so we can update their list adapters.
mFragments = new ArrayList<Fragment>();

// Set up the view pager and tab adapter.
setContentView(R.layout.pager_layout);
mViewPager = (ViewPager) super.findViewById(R.id.pager);

mViewPager.setAdapter(new ListPagerAdapter(super.getSupportFragmentManager()));
}

public void startTrackingFragment(Fragment f) {
mFragments.add(f);
}

public void stopTrackingFragment(Fragment f) {
mFragments.remove(f);
}

public void notifyDataSetChanged() {
for (Fragment fragment : mFragments) {
if (fragment instanceof IDataSetChangedListener) {
((IDataSetChangedListener) fragment).notifyDataSetChanged();
}
}
}
}

有了这些,剩下的就是让 fragment 注册自己以进行更新:

public class FragmentOne extends Fragment implements IDataSetChangedListener {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((TabSwitcherActivity) getActivity()).startTrackingFragment(this);
}

public void onDestroy() {
((TabSwitcherActivity) getActivity()).stopTrackingFragment(this);
super.onDestroy();
}
}

关于在 FragmentPagerAdapter 中存储为数组的 Android Fragments 在离开并返回应用程序后未刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17710727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com