我在 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
答案 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