抽象类中的Recycler视图NullPointerException



我正在处理一个项目,该项目有许多活动,这些活动以完全相同的方式使用回收器视图,只是数据和onClickListener发生了变化,我有以下抽象类,用于使用不同的onClickListener 创建不同的活动

public abstract class AbstractActivity extends ActionBarActivity implements View.OnClickListener{
    private final String[] data;
    RecyclerView.LayoutManager layoutManager;
    RecyclerView.Adapter adapter;
    List<String> list;
    Toolbar toolbar;
    String title;
    int id;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler);
        Toolbar toolbar=(Toolbar)this.findViewById(R.id.toolbar);
        toolbar.setLogo(R.drawable.ic_launcher);
        toolbar.setTitle(title);
        RecyclerView recyclerView=(RecyclerView)this.findViewById(R.id.recycler_view);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.addItemDecoration(new DividerItemDecoration(this, null));
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        list.add("Hello");
        adapter=new CardAdapter(list,id,this);
        recyclerView.setAdapter(adapter);
    }
    public AbstractActivity(String title,String[] data,int id){
     this.title=title;
     this.data=data;
     this.id=id;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_abstract, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public abstract void onClick(View v);
    }
}

回收器布局文件为

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".Syllabus">
    <android.support.v7.widget.Toolbar android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minHeight="@dimen/abc_action_bar_default_height_material"
        android:id="@+id/toolbar"
        android:background="#03a9f4"
        >
    </android.support.v7.widget.Toolbar>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

现在,当我扩展某个类以使用抽象类创建活动时,我会得到nullPointerException

public class Batch extends AbstractActivity {
     public Batch(){
          super("Hello",new String[]{"B.E Syllabus","B.Arch Syllabus","MBA Syllabus","MCA Syllabus","M.Tech Syllabus"},R.layout.main_page);
      }

    @Override
    public void onClick(View v) {

    }
}

logcat条目为

02-14 17:07:03.233    2807-2807/android.anoop.com.vtustudent E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{android.anoop.com.vtustudent/android.anoop.com.vtustudent.Batch}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
        at android.app.ActivityThread.access$600(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4849)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at android.anoop.com.vtustudent.AbstractActivity.onCreate(AbstractActivity.java:37)
        at android.app.Activity.performCreate(Activity.java:5236)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034)

android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
        at android.app.ActivityThread.access$600(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4849)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
        at dalvik.system.NativeStart.main(Native Method)

如果我从布局文件中删除recyclerView,回收器文件中的工具栏会很好地扩展,应用程序会完美运行。此外,如果我在某些活动中直接使用相同的资源文件,它也可以正常工作。只有当我使用抽象类中的布局资源文件时,才会出现错误。为什么会发生这种情况,以及如何纠正这种情况。抽象类的方式是正确的,还是有其他方法可以创建同类活动。我是android编程的新手,任何帮助都将不胜感激。感谢

list从不初始化。所以list.add("Hello");将抛出一个NPE。

简单更改:List<String> list;List<String> list = new ArrayList<String>();

最新更新