代码之家  ›  专栏  ›  技术社区  ›  Brandon

FragmentStatePagerAdapter更新后提供空白片段

  •  1
  • Brandon  · 技术社区  · 6 年前

    我有一个天气适配器来显示天气,活动分为两个屏幕,一个是listview(不同的适配器),另一个是tablayout,里面有另一个tablayout,可以滚动浏览所有不同的天气页面

    关闭wifi以确保我没有接收到任何内容,然后打开wifi以接收天气,我得到适配器调用的更新方法,列表被更新,创建了新片段,调用了onViewCreated,但是片段显示为空白,并且只有1(如果有多个片段,则不能循环通过它们)。

    这是天气预报

    public class WeatherViewPagerAdapter extends FragmentStatePagerAdapter {
    
    private List<Fragment> fragments;
    public WeatherViewPagerAdapter(FragmentManager fm) {
        super(fm);
        fragments = new LinkedList<>();
        if (Storage.getInstance().getWeatherModels().size() == 0){
            // Displays page but with "no weather available" message
            fragments.add(WeatherFragment.newInstance(null));
        }else{
            for (CurrentWeatherModel model : Storage.getInstance().getWeatherModels()){
                fragments.add(WeatherFragment.newInstance(model));
            }
        }
    }
    
    public void rediscoverWeather(){
        fragments.clear();
        if (Storage.getInstance().getWeatherModels().size() == 0){
            fragments.add(WeatherFragment.newInstance(null));
        }else{
            for (CurrentWeatherModel model : Storage.getInstance().getWeatherModels()){
                fragments.add(WeatherFragment.newInstance(model));
            }
        }
    }
    
    @Override
    public int getItemPosition(@NonNull Object object) {
        return POSITION_NONE;
    }
    
    @Override
    public int getCount() {
        return fragments.size();
    }
    
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }
    
    @Override
    public Parcelable saveState() {
        return null;
    }
    }
    

    这是在展示天气的一侧的表格中的片段

    public class WeatherViewPagerFragment extends Fragment {
    
    private WeatherViewPagerAdapter adapter;
    private ViewPager viewpager;
    private TabLayout tabLayout;
    
    public static WeatherViewPagerFragment newInstance(){
        return new WeatherViewPagerFragment();
    }
    
    @Override
    public UniqueInfo getUniqueInfo() {
        return null;
    }
    
    @Override
    public void update() {
        adapter.rediscoverWeather();
        setPage(0);
        adapter.notifyDataSetChanged();
    }
    
    public void setPage(int pageNumber){
        if (pageNumber >=0 && pageNumber < adapter.getCount()){
            viewpager.setCurrentItem(pageNumber, true);
        }
    }
    
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.weather_view_pager, container, false);
    }
    
    private void createAdapter(){
        adapter = new WeatherViewPagerAdapter(getChildFragmentManager());
        viewpager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewpager);
    }
    
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        viewpager = view.findViewById(R.id.viewpager);
        tabLayout = view.findViewById(R.id.sliding_tabs);
        createAdapter();
    }
    }
    

    WeatherViewPagerFragment的update()会在需要时被调用,它会更新适配器,重新执行片段并调用onCreateView和onViewCreated,但我看到的只是一个空白片段,有什么建议说明为什么会发生这种情况吗?我想这可能是一个焦点问题,但我还没有得到任何运气与修复它

    0 回复  |  直到 6 年前
    推荐文章