当一个页面有3个Tab,可以滑动切换,自然想到了使用ViewPager+Fragment实现切换,如果每个Tab的页面都一致,只是请求接口的时候参数不一样的话,就自然会想到在Fragment实现动态加载数据。说的很简单,但是实际操作之后发现有很多的坑啊,各种问题,不能正常加载,或者页面没有显示等情况,现在记录一下,以免日后遇到相同的问题。
在Fragment中设置:
第一步:需要在Fragment进行实例化
主要是统一Fragment的实例化工作。如果Fragment需要外部传递参数,在此函数中要构造相关参数,这一步是必须的
public static MartialMoreFragment newInstance(String categoryArm) { MartialMoreFragment fragment = new MartialMoreFragment(); Bundle bundle = new Bundle(); bundle.putString("category", categoryArm); fragment.setArguments(bundle); return fragment; }
第二步:在Fragment中参数的获取
一要在onCreate方法获取参数。我写在了onCreateView中获取参数,但是看到网上说在onCreate方法中比较好,而onCreateView方法在某些状态下并不会被调用,导致数据丢失。
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); if (args != null) { this.category = args.getString("category"); } LoggerUtil.i(TAG, "onCreate--category--->" + category); }
第三步:在Fragment中参数的更新
更新Fragment内部成员变量的同时也要更新bundleArgs参数中的值。此步骤要和ViewPager适配器配合使用,实现Fragment动态刷新。这一步很关键,当滑动或者点击切换的时候就需要参数的更新,重新请求数据,否则就没有意义啦。
public void updateArguments(String categoryArm) { this.category = categoryArm; Bundle bundleArgs = getArguments(); if (bundleArgs != null) { bundleArgs.putString("category", categoryArm); } LoggerUtil.i(TAG, "updateArguments--category--->" + category); }
在ViewPager的适配器FragmentPagerAdapter中设置:
第一步:实现getItem方法
返回具体Fragment,并且初始化Fragment需要的参数,调用Fragment的newInstance()方法
@Override public Fragment getItem(int position) { return MartialMoreFragment.newInstance(categorys[position]); }
第二步:实现instantiateItem方法
如果需要动态刷新数据,就需要此方法,并且仅能在此方法里,不能是getItem。否则调用notifyDataSetChanged无效。
@Override public Object instantiateItem(ViewGroup container, final int position) { MartialMoreFragment fragment = (MartialMoreFragment) super.instantiateItem(container, position); fragment.updateArguments(categorys[position]); LoggerUtil.i("MartialMoreNoticeFragme","instantiateItem-->position-->"+position); return fragment; }第三步:实现getItemPosition方法
返回PagerAdapter.POSITION_NONE保证调用notifyDataSetChanged刷新Fragment。
@Override public int getItemPosition(Object object) { return PagerAdapter.POSITION_NONE; }第四步:也要实现ViewPager切换监听 OnPageChangeListener 方法
下面附上整体的Activity里面的代码,需要的话可以复制,保留自己需要的功能即可。
1.MartialMoreActivity:
import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView;
public class MartialMoreActivity extends BaseActivity implements View.OnClickListener { private ImageView img_martial_more_back; private TextView[] textViews; private TextView[] textViewLines; private ViewPager viewPager_martial; private String[] categorys = new String[]{ "notice", "activity", "honor"}; private String martialName; private TextView tv_title_name; @Override public int getContentView() { return R.layout.activity_martial_more; } @Override public void initViews(Bundle savedInstanceState) { martialName=getIntent().getStringExtra("martialName"