最近在用www.wanAndroid.com 开放Api。
用TabLayout +ViewPager +Fragment实现以下效果时,遇到了viewpager中的fragment出现错乱的问题。
我之前一直认为是创建fragment时传值有问题,但debug来看并不是这个原因。
//这是viewPager 适配器代码
public class ProjectPagerAdapter extends FragmentPagerAdapter { private List<Project.DataBean> dataBeans=new ArrayList<>(); public ProjectPagerAdapter(@NonNull FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Nullable @Override public CharSequence getPageTitle(int position) { return dataBeans.get(position).getName(); } @NonNull @Override public Fragment getItem(int position) { //在创建fragment时同时把该fragment需要的id传入 return ProjectChildFragment.newInstance(dataBeans.get(position).getId()); } @Override public int getCount() { return dataBeans.size(); } public void setDataBeans(List<Project.DataBean> dataBeans) { this.dataBeans.clear(); this.dataBeans.addAll(dataBeans) ; notifyDataSetChanged(); } }
下面是fragment中部分代码
public static ProjectChildFragment newInstance(int id){ //构造函数 ProjectChildFragment fragment=new ProjectChildFragment(); Bundle bundle=new Bundle(); bundle.putInt("id",id); fragment.setArguments(bundle); return fragment; }@Override public void initData(@Nullable Bundle savedInstanceState) { //初始化数据 if (getArguments()!=null){ id =getArguments().getInt("id"); } initView(); mPresenter.loadChildData(currentNum,id); }@Override public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (rootView!=null){ return rootView; } rootView = inflater.inflate(R.layout.fragment_project_child, container, false); return rootView; }private void initView() { viewPager = getActivity().findViewById(R.id.project_viewPager); materialLayout = getActivity().findViewById(R.id.material_layout); materialLayout.setupWithViewPager(viewPager); projectPagerAdapter = new ProjectPagerAdapter(getChildFragmentManager()); viewPager.setAdapter(projectPagerAdapter); viewPager.setOffscreenPageLimit(0); }//数据获取后回调函数,更新recyclerview中的数据
@Override public void loadRecycler(ProjectChild projectChild) { data.addAll(projectChild.getData().getDatas()); adapter.addData(data); adapter.notifyDataSetChanged(); }
看完以上代码,大概已经发现什么问题了吧。没错问题就是initView里 应该用rootview.findViewById(),而不是getActivity.findViewById().因为当界面中有很多相同的id时,就会找错。这样问题就解决啦。