ViewPager中的android片段可以';t更新

ViewPager中的android片段可以';t更新,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我使用ViewPager创建了3个片段,这是ViewPagerAdapter: public class ViewPagerAdapter extends FragmentStatePagerAdapter { int mNumOfTabs; public ViewPagerAdapter(FragmentManager fm, int NumOfTabs) { super(fm); this.mNumOfTabs = NumOfTabs; } @Override publi

我使用ViewPager创建了3个片段,这是ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;

public ViewPagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            FragFile tab1 = new FragFile();
            return tab1;
        case 1:
            FragAll tab2 = new FragAll();
            return tab2;
        case 2:
            FragFav tab3 = new FragFav();
            return tab3;
        default:
            return null;
    }
}

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

这是Activity1 hold 3片段:

public class Acc1 extends AppCompatActivity {

ViewPager view_pager;

TabLayout tab_layout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_acc1);

    tab_layout = (TabLayout) findViewById(R.id.tab_layout);
    tab_layout.addTab(tab_layout.newTab().setText("File"));
    tab_layout.addTab(tab_layout.newTab().setText("All"));
    tab_layout.addTab(tab_layout.newTab().setText("Fav"));

    view_pager = (ViewPager) findViewById(R.id.viewpager);

    final ViewPagerAdapter adapter = new ViewPagerAdapter
            (getSupportFragmentManager(), tab_layout.getTabCount());

    view_pager.setAdapter(adapter);

    view_pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab_layout));

    tab_layout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            view_pager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });

}
}

在MainActivity中,转到Activity1 hold 3 Fragment。
在Activity1中,Fragment2(FragAll)和Fragment3(FragFav)可以转到Acctivity2。
在Activity2中,可以编辑数据,此数据将显示在Fragment3(FragmfAV)上。

我的问题是:
当编辑Activity2上的数据,并返回Activity1使用backpress时,Fragment3(FragFav)中的数据不会更改。(我认为应用程序保持片段状态)。
但当离开活动1时,使用backpress键返回MainActivity并再次转到Activity1时,Fragment3(FragFav)上的数据发生了更改。(如果从Activity2返回Activity1时,选择Fragment1(FragFile)并选择Fragment3(FragFav),则数据将发生更改)
我知道当从Activity2恢复到Activity1时,我需要刷新或重置Fragment3(Fragment3,FragFav),但我不知道如何做到这一点。
有人能帮我吗?

这是我遵循Drv的更新:
我在java文件夹中创建AppConstants类:

public class AppConstants {
public static boolean refreshPage=false;
public int fragment_position=0;
}

在Activity1中,我将代码更改为:

public class Acc1 extends AppCompatActivity {

ViewPager view_pager;

TabLayout tab_layout;

AppConstants ac;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_acc1);

    tab_layout = (TabLayout) findViewById(R.id.tab_layout);
    tab_layout.addTab(tab_layout.newTab().setText("File"));
    tab_layout.addTab(tab_layout.newTab().setText("All"));
    tab_layout.addTab(tab_layout.newTab().setText("Fav"));

    view_pager = (ViewPager) findViewById(R.id.viewpager);

    final ViewPagerAdapter adapter = new ViewPagerAdapter
            (getSupportFragmentManager(), tab_layout.getTabCount());

    view_pager.setAdapter(adapter);

    view_pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab_layout));

    tab_layout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            view_pager.setCurrentItem(ac.fragment_position);
            ac.fragment_position=tab.getPosition();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });

}

@Override
public void onResume() {
    super.onResume();
    if (AppConstants.refreshPage) {
        AppConstants.refreshPage = false;
        finish();
        startActivity(getIntent());
    }
}
在Activity2中,我添加了以下代码:

@Override
public void onBackPressed() {
    Intent setIntent = new Intent(Acc2.this, Acc1.class);
    AppConstants.refreshPage=true;
    startActivity(setIntent);
}

但是当选择Fragment2(FragAll)和Fragment3(Fragment3)时,我在“view_pager.setCurrentItem(ac.fragment_position);”中出现错误。

您应该使用一些全局标志,如下所示:

public class AppConstants{

 public static boolean refreshPage=false;
 public static int fragment_position=0;

}
AppConstants.refreshPage=true;
if (AppConstants.refreshPage) {
        AppConstants.refreshPage = false;
        finish();
        startActivity(getIntent());
}
YOURTABLAYOUT.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            AppConstants.fragment_position=tab.getPosition();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
 YOURVIEWPAGER.setCurrentItem(AppConstants.fragment_position);
在活动2的背压中,写下以下内容:

public class AppConstants{

 public static boolean refreshPage=false;
 public static int fragment_position=0;

}
AppConstants.refreshPage=true;
if (AppConstants.refreshPage) {
        AppConstants.refreshPage = false;
        finish();
        startActivity(getIntent());
}
YOURTABLAYOUT.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            AppConstants.fragment_position=tab.getPosition();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
 YOURVIEWPAGER.setCurrentItem(AppConstants.fragment_position);
在活动1的简历中,写下以下内容:

public class AppConstants{

 public static boolean refreshPage=false;
 public static int fragment_position=0;

}
AppConstants.refreshPage=true;
if (AppConstants.refreshPage) {
        AppConstants.refreshPage = false;
        finish();
        startActivity(getIntent());
}
YOURTABLAYOUT.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            AppConstants.fragment_position=tab.getPosition();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
 YOURVIEWPAGER.setCurrentItem(AppConstants.fragment_position);
在Activity1中,将所选选项卡位置保存如下:

public class AppConstants{

 public static boolean refreshPage=false;
 public static int fragment_position=0;

}
AppConstants.refreshPage=true;
if (AppConstants.refreshPage) {
        AppConstants.refreshPage = false;
        finish();
        startActivity(getIntent());
}
YOURTABLAYOUT.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            AppConstants.fragment_position=tab.getPosition();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
 YOURVIEWPAGER.setCurrentItem(AppConstants.fragment_position);
并在其onCreate中写入以下内容:

public class AppConstants{

 public static boolean refreshPage=false;
 public static int fragment_position=0;

}
AppConstants.refreshPage=true;
if (AppConstants.refreshPage) {
        AppConstants.refreshPage = false;
        finish();
        startActivity(getIntent());
}
YOURTABLAYOUT.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            AppConstants.fragment_position=tab.getPosition();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
 YOURVIEWPAGER.setCurrentItem(AppConstants.fragment_position);

您可以通过调用Fragment方法来更新数据

首先在片段中创建一个方法,如

public void onUpdateData(Boolean isUpdated) {
    if (isUpdated) {
        Toast.makeText(context, "Updated", Toast.LENGTH_SHORT).show();
        //update your data

    }
}
然后在活动中注册片段并传递上下文(此)

只是别忘了在片段中创建构造函数以避免空对象异常

public FragFav(Context context) {
    this.context = context;
}
现在,无论数据在哪里更新,都从活动调用此方法,并且该方法将在片段中触发

mFragFav.onUpdateData(true);

您可以使用以下代码段: 在onPageSelected上通知FragmentStatePagerAdapter

 if (mSectionsPagerAdapter != null) {
                            mSectionsPagerAdapter.notifyDataSetChanged();
                        }
主要代码:

SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity(),getChildFragmentManager());

            // Set up the ViewPager with the sections adapter.
            mViewPager = (ViewPager)view.findViewById(R.id.container);
            mViewPager.setAdapter(mSectionsPagerAdapter);
            mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                }

                @Override
                public void onPageSelected(int position) {
                    Log.e("changed","mViewPager "+position);
                    try {
                        if (mSectionsPagerAdapter != null) {
                            mSectionsPagerAdapter.notifyDataSetChanged();
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }

                @Override
                public void onPageScrollStateChanged(int state) {

                }
            });
分段自适应

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

        Context mContext;
        FragmentManager fm1;
        public SectionsPagerAdapter(Context context, FragmentManager fm) {
            super(fm);
            fm1=fm;
//            if(multiple_actions.isExpanded()){
//                multiple_actions.collapse();
//            }
            mContext = context;
        }

        @Override
        public Fragment getItem(int position) {

            if(mViewPager.getCurrentItem()==0){
                return ActivityListing.newInstance(0,"preview");
            }else if(mViewPager.getCurrentItem()==1){
                return ActivityListing.newInstance(1,"current");
            }else if(mViewPager.getCurrentItem()==2){
                return ActivityListing.newInstance(2,"next");
            }else {
                return null;
            }
        }
        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {

            switch (position) {
                case 0:
                    return getActivity().getResources().getString(R.string.preview);
                case 1:
                    return getActivity().getResources().getString(R.string.current);
                case 2:
                    return getActivity().getResources().getString(R.string.next);
            }
            return null;
        }
        @Override
        public int getItemPosition(Object object) {
            if(fm1.getFragments().contains(object))
                return POSITION_NONE;
            else
                return POSITION_UNCHANGED;
        }

    }

我明白你的意思,但是当从Activity1中返回时,使用Activity2上的backpress,它不会显示旧片段,而是显示Fragment1(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(Fragment1)(,您正在全局保存SetOnAbselectedListener方法中所选选项卡的位置,当您第一次来或刷新activity1时,您将使用此全局选择的选项卡位置自动加载您在离开activity1时最后单击的片段。