RecyclerAdapter

时间:2016-09-23 11:45:40

标签: android android-studio intellij-idea

更新:问题是由于我的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

2 个答案:

答案 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);