setUserVisibleHint with Fragments for android

Posted

技术标签:

【中文标题】setUserVisibleHint with Fragments for android【英文标题】: 【发布时间】:2015-11-09 07:42:03 【问题描述】:

我在我的 ViewPager 适配器 中使用了 3 个片段。我将从 Parse(parse.com) 加载数据并在回收站视图中显示它们。以下代码导致我的应用程序崩溃。我的理解是,当我的 MainActivity 加载时,这是我的第一个片段,即它立即被用户查看,因此 setUserVisibleHint 函数被立即调用并在该 v.findViewById代码导致空指针异常,因为可能未调用 setContentView hasnt/。我的证明是,如果我向 setUserVisisbleHint 添加 1 秒延迟,那么我的代码可以正常工作。

现在我想使用 Parse 添加服务器 PULL 请求,将列表中的数据添加到适配器并在用户查看页面后填充 recyclerview

1) 我是否应该在 setUserVisisbleHint 中添加所有代码并添加 0.5secc 延迟,以便在调用 setContentView 后执行它,确保我没有收到空指针异常错误或

2) 有没有更好的方法/我可以使用其他功能来实现相同的功能?

public class NewsFeed extends Fragment 
        LinearLayoutManager mLayoutManager;
        boolean _areLecturesLoaded=false;
        View v;
        ProgressBar bar;

        public NewsFeed() 
            // Required empty public constructor
        

        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                                 @Nullable Bundle savedInstanceState) 
            // Inflate the layout for this fragment
            v=inflater.inflate(R.layout.fragment_news_feed, container, false);

            RecyclerView mRecyclerView = (RecyclerView)v.findViewById(R.id.recycler_view);
            mRecyclerView.setHasFixedSize(true);
            mLayoutManager = new LinearLayoutManager(v.getContext());
            mRecyclerView.setLayoutManager(mLayoutManager);    
            MyStickyAdapter mAdapter = new MyStickyAdapter(v.getContext());    
            mRecyclerView.setAdapter(mAdapter);
           // mRecyclerView.addItemDecoration(new StickyRecyclerHeadersDecoration(mAdapter));
            return v;
        

        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) 
            super.setUserVisibleHint(isVisibleToUser);
            if (isVisibleToUser && !_areLecturesLoaded ) 
                _areLecturesLoaded = true;
                v.findViewById(R.id.asd).setVisibility(View.GONE);
            
        


    //Closes Fragment

我将这个库用于我的回收站视图StickyHeaderRecyclerView

【问题讨论】:

阅读这个有用的答案***.com/a/39911028/3496570 【参考方案1】:

我强烈建议避免添加延迟,特别是如果您在主线程上运行它。为避免 NPE,请在为视图充气后尝试将​​ findViewById(R.id.asd) 移动到 onCreateView 方法中:

@Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) 
        // Inflate the layout for this fragment
        v=inflater.inflate(R.layout.fragment_news_feed, container, false);
        v.findViewById(R.id.asd).setVisibility(View.GONE);

这是假设 R.id.asd 在 R.layout.fragment_news_feed 中

这篇文章还可以提供一些见解: setUserVisibleHint called before onCreateView in Fragment

【讨论】:

这个片段被立即查看。在这种情况下,可以在 onCreate 完成之前引用进度条。这再次引发空指针异常。 在视图膨胀之前,您无法真正绕过访问视图中的元素。是否可以在视图膨胀后移动您正在执行的任何视图操作? 第一个片段总是在应用程序启动时加载,因此我将 setUserVisbleHunt 作为其多余部分从中删除,并将其用于其他工作正常的片段。 是的,另一个片段的 onCreate 总是在用户能够滑动到它们之前完成,所以在这种情况下没有崩溃,对于第一个片段,我已经将 setUserVisibleHint 全部删除,因为它并不真正需要,所以这也不会导致崩溃。问题是您无法在视图膨胀后移动操作,因为 setUserVisibleHint 本身是一个带有 @Override 的单独函数,因此一旦应用程序启动,它就会自动调用。不过感谢您的帮助。

以上是关于setUserVisibleHint with Fragments for android的主要内容,如果未能解决你的问题,请参考以下文章

关于Fragment的setUserVisibleHint() 方法和onCreateView()的执行顺序

Fragment的setUserVisibleHint方法实现懒加载

setUserVisibleHint的使用.执行顺序和viewPager.setOffscreenPageLimit不管用还是默认会加载第二个fragment

FragmentPagerAdapter加载fragment并使用setUserVisibleHint()处理预加载时遇到的坑,给textview赋值时出现的空指针异常

Android viewpager + fragment取消预加载

4.4文件操作:with