如何刷新viewpager中的listfragment?



场景是这样的。在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


    }



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


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


Done!!


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值