setUserVisibleHint with Fragments for android

时间:2015-08-16 16:22:23

标签: android android-fragments tabs android-viewpager android-recyclerview

我在 ViewPager适配器 中使用了3个片段。我将从Parse(parse.com)加载数据并在回收站视图中显示它们。以下代码导致我的应用程序崩溃。我的理解是,当我的MainActivity加载时,这是我的第一个片段,即,用户立即查看它,以便立即调用 setUserVisibleHint 函数并在该v.findViewById中调用代码导致空指针异常,因为 setContentView 没有/可能没有被调用。我的证明是,如果我为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

1 个答案:

答案 0 :(得分:0)

我强烈建议避免添加延迟,尤其是如果您在主线程上运行此延迟。要避免使用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