选项卡之间更改时刷新片段

时间:2017-01-14 22:41:20

标签: android android-fragments

App在第一个片段上打开,有2个标签我想刷新第二个片段 当我移动它但我不想刷新第一个片段

MainActivity

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);
    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

}
private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new Main_Button(), "Main");
    adapter.addFragment(new TwoFragment(), "Main2");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

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

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

请解释你的答案,因为我是android的新手,我不知道我该怎么做

7 个答案:

答案 0 :(得分:33)

Fragment可见时(即ViewPager中的所选页面),会调用其setUserVisibleHint()方法。您可以在TwoFragment中覆盖该方法,并使用它来触发刷新。

public class TwoFragment extends Fragment {

  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
      // Refresh your fragment here
    }
  }

答案 1 :(得分:21)

在您的片段类中使用以下代码:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        getFragmentManager().beginTransaction().detach(this).attach(this).commit();
    }
}

答案 2 :(得分:1)

试试这个

ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2); 

答案 3 :(得分:1)

试试这个 - 它对我有用

此代码在用户可见时重新加载当前片段。在滑动时和在下一个片段上按下后退按钮时有效。

@Override
    public void setUserVisibleHint(boolean isVisible) {
        super.setUserVisibleHint(isVisible);
        if (isVisible) {
                FragmentTransaction ftr = getFragmentManager().beginTransaction();
                ftr.detach(this).attach(this).commit();
        }
    }

答案 4 :(得分:0)

如果您不介意每次更改选项卡时刷新每个片段,您可以简单地覆盖FragmentPagerAdapter的getItemPosition()方法,并使其始终返回值POSITION_NONE。例如:

@Override
public int getItemPosition(Object object) {
   return POSITION_NONE;
}

通过这样做,你告诉android每次视图寻呼机尝试获取它时刷新片段。性能方面,这不是最好的做法。所以还有第二种方法:

首先,创建一个在需要刷新时调用的接口:

public interface Updatable {
   public void update();
}

然后,让你的片段实现这个接口:

public class MyFragment extends Fragment implements Updateable {

   ...

   @Override
   public void update() {
     // refresh your fragment, if needed
   }
}

如果您真的希望更新您的第一个片段,请在update()方法中执行任何操作。

第三,覆盖getItemPosition方法并致电update()。每次选择一个片段时都会调用它:

@Override
public int getItemPosition(Object object) {
   Updatable f = (Updatable) object;
   if (f != null) {
      f.update();
   }
  return super.getItemPosition(object);
}

此代码大部分来自this answer

答案 5 :(得分:0)

从2020年开始,建议使用LiveData和viewModel等架构组件(MVVM)

这样,所有片段都可以共享同一状态

在此处查看文档https://developer.android.com/jetpack/guide

答案 6 :(得分:0)

您可以使用 ViewPager.addOnPageChangeListener 来监听片段何时被滑动并在那里合并某种类型的操作。