ViewPager中的android片段可以';t更新
我使用ViewPager创建了3个片段,这是ViewPagerAdapter: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
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时最后单击的片段。