场景是这样的。在MainActivity中的onCreate中定义了viewPager,其设置的adapter为一个自定义的继承了FragmentPagerAdapter的adapter。


 
   @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mViewPager = (ViewPager) findViewById(R.id.pager);// add tab to action bar heremProjectListAdapter = new MyProjectListAdapter(getSupportFragmentManager());mViewPager.setAdapter(mProjectListAdapter);mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {@Overridepublic 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);}@Overridepublic 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();}}@Overridepublic 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    }



notifyDataSetChanged()意思是告诉viewPager的adapter,其中的数据有变化,adapter需要refresh自己


接着,adapter就会调用自身定义的getItemPosition方法,来判断是否需要refresh。定义见前述代码。
如果返回的是POSITION_UNCHANGED,那么表示不需要refresh。如果返回的是POSITION_NONE,那么表示需要refresh。显然我们这里需要返回POSITION_NONE。
接下来adapter就会去重新initialize fragments in viewpager. 我们的目的也就达到了!


Done!!


如有更好的方法,不妨留言探讨!


更多相关文章

  1. C语言函数的递归(上)
  2. 9.0 添加自定义服务
  3. Android(安卓)onBackPressed()函数重载失效问题
  4. 在android media framework中添加播放器
  5. Android(安卓)Timer
  6. Android(安卓)Trusty TEE 2.启动分析
  7. 【COCOS2DX-ANDROID-游戏开发之二三】 界面中嵌入Android的WebVi
  8. Android源码学习之五-Android的IPC机制
  9. ListView 样式自定义

随机推荐

  1. 我的Android NDK之旅(四),android串口通信-m
  2. android之LinearLayout中android:layout_
  3. 通过android代码获取android系统的imei、
  4. 自己写一个flutter插件
  5. 【Android】注解框架(二) 基础知识(Java注解
  6. Android 平台的几个编译命令----make,mmm
  7. 使用平台的风格和主题
  8. Android跨进程通信IPC
  9. Android中webview加载的网页上的按钮点击
  10. Android(安卓)ZXing改横屏识别为竖屏识别