更新:问题是由于我的RecyclerView初始化两次,一次是全局的,另一次是本地的。由于未分配的RecyclerView被用于我的数据适配器,这导致了NullPointerException。
每当我启动应用程序时,我都会收到NullPointerException。请不要标记这是重复的,因为我认为这不是一个NullPointerException问题,而是我的方法的结构问题。
我的 onCreate()有一个名为initialise()
的方法,它将适配器的初始化与启动和刷新分开:
private boolean initialise() {
boolean isOnline = NetworkHelper.isOnline(this);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
retrieveYeets();
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
mSwipeRefreshLayout.setOnRefreshListener(() -> {
if (!isOnline) {
mSwipeRefreshLayout.setRefreshing(false);
} else {
retrieveYeets();
}
});
return isOnline;
}
以下方法完成适配器创建:
private void retrieveYeets() {
String groupId = ParseUser.getCurrentUser().getString("groupId");
ParseQuery<ParseObject> query = new ParseQuery<>(ParseConstants.CLASS_MESSAGE);
query.whereContains(ParseConstants.KEY_GROUP_ID, groupId);
query.orderByDescending("lastReplyUpdatedAt");
query.setLimit(1000);
query.findInBackground((yeets, e) -> {
if (mSwipeRefreshLayout.isRefreshing()) {
mSwipeRefreshLayout.setRefreshing(false);
}
if (e == null) {
// We found messages!
mYeets = yeets;
System.out.println(yeets);
FeedAdapter adapter = new FeedAdapter(getApplicationContext(), yeets);
adapter.setHasStableIds(true);
recyclerView.setAdapter(adapter);
}
});
}
如您所见,我可以打印出我的列表,它是 not null 。然后我将我的列表提供给我的适配器。这不应该工作吗?为什么例外?
例外:
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at com.yitter.feed.FeedAdapter.getItemCount(FeedAdapter.java:466)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3170)
适配器:
课程相当大,但相关部分很容易消化,即你可以搜索 onCreateViewHolder , onBindViewHolder ,所以我提供了一个要点:
要点:https://gist.github.com/santafebound/70a82fb9a3349930a030ef66b426a04b
答案 0 :(得分:1)
在getItemCount()
内(在适配器中)返回mYeets.size()
,如果mYeets尚未初始化(在加载数据之前),则会失败
将getItemCount()
更改为:
if (mYeets == null) {
return 0;
} else {
return mYeets.size();
}
答案 1 :(得分:1)
我遇到了你的问题。您已声明RecyclerView
两次。因此,在初始化方法中,您已初始化了RecyclerView
方法中为空的另一个retrieveYeets()
。所以只需更改initialise()
方法
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
到
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);