如何刷新viewpager中的listfragment?
16lz
2021-01-24
场景是这样的。在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 }
接着,adapter就会调用自身定义的getItemPosition方法,来判断是否需要refresh。定义见前述代码。
如果返回的是POSITION_UNCHANGED,那么表示不需要refresh。如果返回的是POSITION_NONE,那么表示需要refresh。显然我们这里需要返回POSITION_NONE。
接下来adapter就会去重新initialize fragments in viewpager. 我们的目的也就达到了!
Done!!
如有更好的方法,不妨留言探讨!
更多相关文章
- C语言函数的递归(上)
- 9.0 添加自定义服务
- Android(安卓)onBackPressed()函数重载失效问题
- 在android media framework中添加播放器
- Android(安卓)Timer
- Android(安卓)Trusty TEE 2.启动分析
- 【COCOS2DX-ANDROID-游戏开发之二三】 界面中嵌入Android的WebVi
- Android源码学习之五-Android的IPC机制
- ListView 样式自定义