我正在处理一个项目,该项目有许多活动,这些活动以完全相同的方式使用回收器视图,只是数据和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>();