【问题标题】:How to load fragment data only when its tab is clicked in PagerSlidingTabStrip如何仅在 PagerSlidingTabStrip 中单击其选项卡时加载片段数据
【发布时间】:2013-12-19 07:18:19
【问题描述】:

我在我的项目中使用PagerSlidingTabStrip 并以片段的形式显示数据。它是一个很棒的图书馆,效果很好。每个片段都包含从 Web 服务加载的学者讲座。访问 Web 服务的代码在 Fragment 的 onCreateView 方法中。当前所有片段的数据在添加到ViewPager 的同时加载。我想知道是否有任何方式仅在用户单击/滑动到特定选项卡时才加载片段的数据。不是一次全部。

当前代码非常标准,我从提供的示例 [android 解决方案] 中获得了帮助。1

Pager Adapter 如下:

public class ScholarDetailPagerAdapter extends FragmentPagerAdapter {

    private final String[] TITLES = { "Scholar Info", "Lectures"};
    Scholar _scholar;

    public ScholarDetailPagerAdapter(FragmentManager fm, Scholar scholar) {
        super(fm);
        _scholar = scholar;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }

    @Override
    public Fragment getItem(int arg0) {
        if(arg0 == 0)
            return ScholarsInfoFragment.netInstance(_scholar.Name, _scholar.Information, _scholar.ThumbnailUrl);
        else
            return ScholarLecturesFragment.newInstance(_scholar.ScholarId);
    }

    @Override
    public int getCount() {
        return TITLES.length;
    }

}

它返回两个片段,Info 和 Lectures。 Lectures Fragment 调用 Web 服务来获取学者的讲座。

活动代码为:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set the Above View
    setContentView(R.layout.tabbed_view);
    Scholar scholar = getScholar(getIntent());      

    _tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
    _pager = (ViewPager) findViewById(R.id.pager);
    _adapter = new ScholarDetailPagerAdapter(getSupportFragmentManager(), scholar);

    _pager.setAdapter(_adapter);

    final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
            .getDisplayMetrics());
    _pager.setPageMargin(pageMargin);

    _tabs.setViewPager(_pager);
} 

我尝试添加 _tabs.setOnPageChangeListener(this); 并最终在我的活动中添加了 onPageSelected(int arg0)。我以为现在很容易。然后我修改了上面ScholarDetailPagerAdapter中的public Fragment getItem(int arg0),返回了null,而不是返回两个片段。但这引发了一个例外。我以为它会在寻呼机中呈现空视图..但我当然错了。

为了确保 Fragment 在其各自的选项卡被单击并且可见时加载数据,我还尝试覆盖其以下事件并在其中编写数据加载调用:

  1. onResume() 没用。在活动中添加时仍然加载数据

  2. 尝试覆盖 onHiddenChanged

    @Override   
    public void onHiddenChanged(boolean hidden) {
    
        super.onHiddenChanged(hidden);
    
        if(!hidden){
            loadLectures();
        }
    

    }

这也不起作用。没有加载数据,就好像这个事件根本没有被触发一样。

我该怎么做?我只是想在用户单击选项卡时加载一个片段。

提前致谢

【问题讨论】:

    标签: android android-fragments android-viewpager pagerslidingtabstrip


    【解决方案1】:

    您可以覆盖片段的setUserVisibleHint 事件以了解其是否对用户可见,然后加载您的数据。类似于以下内容:

    boolean _areLecturesLoaded = false;
    
    @Override
     public void setUserVisibleHint(boolean isVisibleToUser) {
         super.setUserVisibleHint(isVisibleToUser);
         if (isVisibleToUser && !_areLecturesLoaded ) {
          loadLectures(); 
          _areLecturesLoaded = true;
         }
     }
    

    【讨论】:

    • 如果你在onCreateView函数中注入一个子片段怎么办?我不希望我的MapFragment 加载SupportMapFragment,直到标签被实际点击。
    • 这种方法调用getContext()安全吗?
    • @Zapnologica 我试过了,有一个异常空对象
    • 它对我不起作用,我的 View Pager 中只有两个标签
    【解决方案2】:
    private boolean isLoaded =false,isVisibleToUser;
    
    @Override
    
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser=isVisibleToUser;
        if(isVisibleToUser && isAdded() ){
            loadData();
            isLoaded =true;
        }
    }
    
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
      if(isVisibleToUser && (!isLoaded)){
            loadData();
            isLoaded=true;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2021-10-02
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多