1

我有一个Fragment包含 a 的ViewPager,现在ViewPager包含 3 个不同的项目,即每个项目(页面)都包含 aListView并且每个列表都拥有它Adapter,我不能使用FragmentPagerAdapter

正弦ViewPager生活在一个Fragment

我应该加载所有三个ListViews数据Fragment并将其传递给PagerAdapter吗?

4

2 回答 2

3
   public  abstract class BaseLazyFragment extends Fragment {

    protected boolean isVisible;


    /**
     * to judge if is visible to user 
     * @param isVisibleToUser
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if(getUserVisibleHint()) {
            this.isVisible = true;
            onVisible();
        } else {
            this.isVisible = false;
            onInvisible();
        }

    }


    /**
     * when the  fragment is not visible to user 
     */
    protected void onInvisible() {
        Loggy.e("do  onInvisible");
    }

    /**
     * when the fragment is visible to user 
     * 
     * lazyload
     */
    protected void onVisible() {
        Loggy.e("do  onVisible---");
        lazyLoad();
    }

    protected abstract void lazyLoad();

    }

然后您可以创建一个客户片段扩展 BaseLazyFragment 例如

   public class NewsFragment extends BaseLazyFragment {

    private boolean isPrepared; 
    //a flag to judge init action has finished

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_news_page,null);

        //do init

        // when init is finish , set flag true;
        isPrepared = true;

        lazyLoad();

        return view;
    }

    @Override
    protected void lazyLoad() {

         // according this judge, can prevent nullpointerexception 
        if(!isPrepared || !isVisible){
            return;
        }

        // assignment the view 
        // get data from network assignment to varible
    }
}

设置用户可见提示()

片段创建时 setUserVisibleHint() 方法第一次比 onCreateView() 头,所以由于 oncreateView() 没有被调用,所以lazyLoad() 方法可能会抛出 NullPointerException,所以你应该创建一个标志变量 --> isPrepared。

onCreateView()

参考链接

于 2015-09-22T12:39:05.073 回答
2

实际上,这取决于您要加载的数据有多大?

如果它很大,请尝试下载 ie。每页 10 个项目,并将该数据传递给适配器并缓存它。之后,实施惰性加载器(例如在 google play 应用程序中),它会为您的正确页面下载下一个项目,而不是全部。

所以你所有的三个页面都会在第一次加载时显示数据,如果用户想要更多,他可以导航到列表底部,按“加载更多”并获取更多项目:)

根据我的经验,这个解决方案效果很好。当然这种加载器应该采用服务器端。

还有更多的考虑,即。也许您的数据“非常活跃”。所以你必须考虑一下。

于 2012-09-19T09:05:09.083 回答