2012-04-22 80 views
-2

我正在使用ArrayAdapter来显示通过ListView保存在数组中的数据,我的代码编译正常,但是当我调用下面的类时会导致该过程以Sorry application has stopped异常结束。ListView上需要的指针

public class Timetable extends Activity { 

    private ListView timeTableView; 
    private ArrayList <Module> Modules; 
    private ArrayAdapter <Module> adaptModule; 

    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.view); 

      timeTableView = (ListView) findViewById(R.id.timeTableView); 

      adaptModule = new ArrayAdapter<Module>(this, android.R.layout.simple_list_item_1, Modules); 
      timeTableView.setAdapter(adaptModule); 
    } 
    } 

这里是我Add类与创建一个数组,并添加项目到数组优惠:

public class Add extends Activity implements OnClickListener{ 

private EditText ModuleText; 
private EditText RoomText; 
private Spinner Day; 
private Spinner Start; 
private Spinner Duration; 
private Spinner Session; 
private ArrayList<Module> Modules; 

/* 
* OnCreate method for add class 
* @see android.app.Activity#onCreate(android.os.Bundle) 
*/ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.add); 

    // spinner for days 
    Spinner day = (Spinner) findViewById(R.id.spinnerDay); 
    ArrayAdapter<CharSequence> adapterDay = ArrayAdapter.createFromResource(
      this, R.array.days_array, android.R.layout.simple_spinner_item); 
    adapterDay.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    day.setAdapter(adapterDay); 


    // spinner for start time 
    Spinner startTime = (Spinner) findViewById(R.id.spinnerStart); 
    ArrayAdapter<CharSequence> adapterstart = ArrayAdapter.createFromResource(
      this, R.array.start_array, android.R.layout.simple_spinner_item); 
    adapterstart.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    startTime.setAdapter(adapterstart); 

    // spinner for duration 
    Spinner duration = (Spinner) findViewById(R.id.spinnerDuration); 
    ArrayAdapter<CharSequence> adapterduration = ArrayAdapter.createFromResource(
      this, R.array.duration_array, android.R.layout.simple_spinner_item); 
    adapterduration.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    duration.setAdapter(adapterduration); 

    // spinner for class type 
    Spinner session = (Spinner) findViewById(R.id.spinnerSession); 
    ArrayAdapter<CharSequence> adapterSession = ArrayAdapter.createFromResource(
      this, R.array.session_array, android.R.layout.simple_spinner_item); 
    adapterSession.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    session.setAdapter(adapterSession); 

    //create array 
    Modules = new ArrayList<Module>(); 

    // ref to UI Widgets 
    ModuleText = (EditText) findViewById(R.id.ModuleText); 
    RoomText = (EditText) findViewById(R.id.RoomText); 
    Day = (Spinner) findViewById(R.id.spinnerDay); 
    Start = (Spinner) findViewById(R.id.spinnerStart); 
    Duration = (Spinner) findViewById(R.id.spinnerDuration); 
    Session = (Spinner) findViewById(R.id.spinnerSession); 


    // buttons for this activity also includes listeners 
    View addEntryButton = findViewById(R.id.addEntry_button); 
    addEntryButton.setOnClickListener(this); 
    View cancelEntryButton = findViewById(R.id.cancelEntry_button); 
    cancelEntryButton.setOnClickListener(this); 


} 

/* 
* on click listeners for buttons 
* @see android.view.View.OnClickListener#onClick(android.view.View) 
*/ 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.cancelEntry_button: 
     Intent i = new Intent(this, Home.class); 
     startActivity(i); 
     break; 

    } 
    switch (v.getId()) { 
     case R.id.addEntry_button: 
      Intent i = new Intent(this, Home.class); 
      addModule(); 
      startActivity(i); 
      break; 
    } 

    } 

    /* 
    * Method for adding an entry into the table 
    */ 
public void addModule() 
    { 
    if(ModuleText !=null || RoomText !=null) 
    { 
    Modules.add(new Module(ModuleText.getText().toString(), RoomText.getText().toString(), Day.getSelectedItem().toString(), Start.getSelectedItem().toString(), Duration.getSelectedItem().toString(), Session.getSelectedItem().toString())); 
    Toast.makeText(getApplicationContext(), "Timetable entry has been added succesfully", Toast.LENGTH_SHORT).show(); 
    } 
    else 
    { 
     Toast.makeText(getApplicationContext(), "Error adding timetable entry, please check details and try again", Toast.LENGTH_SHORT).show(); 
    } 

    } 


} 

这是我logcat不同之处:

04-22 11:52:46.290: E/AndroidRuntime(426): FATAL EXCEPTION: main 
04-22 11:52:46.290: E/AndroidRuntime(426): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.assignment.timetable/org.assignment.timetable.Timetable}: java.lang.NullPointerException 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
04-22 11:52:46.290: E/AndroidRuntime(426): at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.os.Looper.loop(Looper.java:123) 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.main(ActivityThread.java:4627) 
04-22 11:52:46.290: E/AndroidRuntime(426): at java.lang.reflect.Method.invokeNative(Native Method) 
04-22 11:52:46.290: E/AndroidRuntime(426): at java.lang.reflect.Method.invoke(Method.java:521) 
04-22 11:52:46.290: E/AndroidRuntime(426): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
04-22 11:52:46.290: E/AndroidRuntime(426): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
04-22 11:52:46.290: E/AndroidRuntime(426): at dalvik.system.NativeStart.main(Native Method) 
04-22 11:52:46.290: E/AndroidRuntime(426): Caused by: java.lang.NullPointerException 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:291) 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.widget.ListView.setAdapter(ListView.java:436) 
04-22 11:52:46.290: E/AndroidRuntime(426): at org.assignment.timetable.Timetable.onCreate(Timetable.java:25) 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
+0

你删除的问题,都具有相同的问题,用户将无法找到自己的答案。因为你...谢谢一堆 – thepoosh 2012-05-01 11:14:07

+0

对不起,这只是一个个人项目的代码,所以不希望人们复制它等... – mitchnufc 2012-05-01 14:32:07

+1

@mitchnufc - 张贴在堆栈溢出已同意授权为创意公地。预计问题具有长期持久价值。如果你不想展示真实的代码,那么你总是可以做一个最小但完整的例子,这无论如何都是一件好事,因为它使问题变得更清晰,并将其简化为问题的核心部分。 – Flexo 2012-05-02 09:52:14

回答

1

你永远不会初始化Modules场在Timetable类,当你在adaptModule适配器使用它,它会引发你看到的NullPointerException。如果您在其他活动中构建Modules列表,然后尝试将其显示在Timetable活动中,那么您必须通过该活动的Modules列表(可能是Add活动)并在该适配器中使用该列表。

有关于如何传递ArrayList从一个活动到另一个活动的各种方式,你可以在这里#2看到更多的例子,例如:

Android: how to pass ArrayList<object> from an activity to another

小例子补充说:

扩展Application类:

/** 
* The class that extends Application, and where we will store our ArrayList 
*/ 
public class MyApplication extends Application { 

    /** 
    * This will hold your Modules list so we can access it from evry activity 
    */ 
    private ArrayList<Module> mModules; 

    /** 
    * We will call this method when we want to store the list of modules(for 
    * example when we finish adding elements to it(in the Add activity) and we 
    * are switching to the Timetable activity) 
    */ 
    public void setModulesList(ArrayList<Module> data) { 
     this.mModules = data; 
    } 

    /** 
    * Retrieve the list of modules and work with it(for example to display it 
    * in the Timetable activity) 
    */ 
    public ArrayList<Module> getModulesList() { 
     return mModules; 
    } 
} 

我们添加元素的Modules列表中的活动:

public class AddActivity extends Activity { 

    // local list of modules on which, in this activity, we will add elements 
    private ArrayList<Module> items = new ArrayList<Module>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // simple layout with one Button that will get us to the Timetable 
     // activity 
     Button b = new Button(this); 
     b.setText("I've put something in the Modules arrayList so go to the new activity"); 
     b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // we are switching to the other activity so store the list of 
       // modules in MyApplication 
       ((MyApplication) getApplicationContext()).setModulesList(items); 
       Intent i = new Intent(AddActivity.this, Timetable.class); 
       startActivity(i); 
      } 
     }); 
     setContentView(b); 
     // some dummy work, adding elements to the list of Modules. 
     for (int i = 0; i < 12; i++) { 
      items.add(new Module("Module " + i)); 
     } 

    } 
} 

,我们将显示的以前在AddActivity创建Modules列表中的活动:

为了让我们的MyApplication到我们必须将其注册到清单中(请参阅应用程序元素,并添加android:name标签):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.luksprog.passit" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="8" /> 

    <application 
     android:name=".MyApplication" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".AddActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".Timetable" 
      android:label="@string/app_name" > 
     </activity> 
    </application> 

</manifest> 

最后的Module类:

/** 
* A small Module class. 
* 
*/ 
public class Module { 

    String name; 

    public Module(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     //This will show a nice string in the `ListView` 
     return "This is:" + name; 
    } 

} 
现在
+0

感谢您的建议是否有任何详细的解释在这里?谢谢 – mitchnufc 2012-04-22 12:54:37

+0

@mitchnufc我不知道任何教程推荐,但我已经添加到我的答案一个小例子,使用'Application'类。 – Luksprog 2012-04-22 13:46:54

+0

感谢您的帮助,这是否意味着我将有另一个名为addactivity的类? – mitchnufc 2012-04-22 13:48:53

0

在你的代码模块没有初始化任何地方。 private ArrayList模块;

initailize它...

+0

我在不同的类上创建一个数组,试图通过将适配器应用到列表视图来显示该数组 – mitchnufc 2012-04-22 11:54:57