场景是这样的。在MainActivity中的onCreate中定义了viewPager,其设置的adapter为一个自定义的继承了FragmentPagerAdapter的adapter。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (ViewPager) findViewById(R.id.pager);
// add tab to action bar here
mProjectListAdapter = new MyProjectListAdapter(
getSupportFragmentManager());
mViewPager.setAdapter(mProjectListAdapter);
mViewPager
.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// When swiping between different app sections, select
// the corresponding tab.
// We can also use ActionBar.Tab#select() to do this if
// we have a reference to the
// Tab.
mActionBar.setSelectedNavigationItem(position);
}
});
通过 setSelectedNavigationItem 将viewPager和ActionBar中的Tab联系起来。
在mProjectListAdapter中设置每个tab对应的fragment实例。
public static class MyProjectListAdapter extends FragmentPagerAdapter {
public MyProjectListAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int item_num) {
switch (item_num) {
case MY_PROJECT_LIST_ID:
return new MyProjectListFrag();
case TEAM_PROJECT_LIST_ID:
return new TeamProjectListFrag();
case DISCOVER_PROJECT_LIST_ID:
return new DiscoverProjectListFrag();
default:
return new MyProjectListFrag();
}
}
@Override
public int getCount() {
return TAB_NUM;
}
/*
This method is used to refresh fragment in viewpager
It can only be triggered by method refreshViewPager() in MainActivity
*/
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
然后在MainActivity的onOptionsItemSelected中定义一个item,当click item的时候,show一个dialog,当press OK in this dialog的时候,dialog返回然后去刷新MainActivity的viewPager中的fragment。这就是问题。那么如何去实现呢?
首先,在dialog的setPositiveButton函数中获取MainActivity,并调用其中自定义的一个method(我这里函数名叫refreshViewPager):
setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MainActivity mActivity = (MainActivity) getActivity();
mActivity.refreshViewPager();
}
}
)
此时,程序走到MainActivity中,该函数定义如下:
public void refreshViewPager(){
mViewPager.getAdapter().notifyDataSetChanged();
// Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself
}
接着,adapter就会调用自身定义的getItemPosition方法,来判断是否需要refresh。定义见前述代码。
如果返回的是POSITION_UNCHANGED,那么表示不需要refresh。如果返回的是POSITION_NONE,那么表示需要refresh。显然我们这里需要返回POSITION_NONE。
接下来adapter就会去重新initialize fragments in viewpager. 我们的目的也就达到了!
Done!!
如有更好的方法,不妨留言探讨!