java - RecyclerView.setLayoutManager 上的 NPE

标签 java android

我正在尝试在我的 android 应用程序中使用 CardView,我正在学习第二个教程,但在同一方法上仍然出现相同的错误。你能指出我做错了什么吗?

这是错误代码:

  java.lang.RuntimeException: Unable to start activity ComponentInfo{co.scuer.licznik/co.scuer.licznik.EventsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
   at android.app.ActivityThread.-wrap11(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:148)
   at android.app.ActivityThread.main(ActivityThread.java:5417)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
   at co.scuer.licznik.EventsFragment.onViewCreated(EventsFragment.java:46)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:988)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
   at android.app.BackStackRecord.run(BackStackRecord.java:793)
   at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
   at android.app.FragmentController.execPendingActions(FragmentController.java:325)
   at android.app.Activity.performStart(Activity.java:6252)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
   at android.app.ActivityThread.-wrap11(ActivityThread.java) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:148) 
   at android.app.ActivityThread.main(ActivityThread.java:5417) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

这是 EventsFragment 中提到的方法:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    EventObject[] objects = (EventObject[]) getArguments().getSerializable(OBJECTS_KEY);

    eventsRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
    eventsRecyclerView.setAdapter(new EventsAdapter(objects));

}

EventsAdapter.java:

package co.scuer.licznik;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class EventsAdapter extends RecyclerView.Adapter<EventsAdapter.EventsViewHolder> {


    private final EventObject[] events;

    public EventsAdapter(EventObject[] events) {
        this.events = events;
    }

    @Override
    public EventsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_event, parent, false);
        return new EventsViewHolder(view);
    }

    @Override
    public void onBindViewHolder(EventsViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return events.length;
    }

    class EventsViewHolder extends RecyclerView.ViewHolder {

        public EventsViewHolder(View itemView) {
            super(itemView);
        }
    }
}

item_event.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/itemImageView"
            android:background="@android:color/black"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/itemTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />


    </LinearLayout>

</android.support.v7.widget.CardView>

我似乎无法解决这个问题。告诉我是否需要发布更多代码。

编辑:

我确实覆盖了 onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_events, container, false);
    ButterKnife.bind(this, view);
    return view;
}

最佳答案

首先在 fragment 中初始化您的 View 。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.your_fragment, container, false);
}

然后初始化您的 UI 组件。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

// Init your RecyclerView here
   RecyclerView eventsRecyclerView = (RecyclerView)view.findViewById(R.id.your_viewid);

   EventObject[] objects = (EventObject[]) getArguments().getSerializable(OBJECTS_KEY);
   eventsRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
   eventsRecyclerView.setAdapter(new EventsAdapter(objects));
}

关于java - RecyclerView.setLayoutManager 上的 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323498/

相关文章:

java - 如何使用 webflux 提供静态资源但支持 CACHE

android:关于使用缓存显示图片的一些疑惑

android - IntelliJ IDE 中的 Android 应用程序中的 NoClassDefFoundError

android - 使用 System.getProperty ("os.arch") 检查它是否是 armeabi cpu

java - 没有 AWT 的 Swing GUI 监听器

java - jtable 中自动附加的额外列(如何删除它)

java - 使用java计算体积和表面积

java - MapEditor 导出为 JSON - 对象已加密?

Android Two Fragment ListView 布局异常

android - 是否可以创建一个项目比 json 多的模型?