2013-01-07 40 views
4

美好的一天。我遇到了一些與我的android項目特別是listview有關的問題。我試圖在本網站搜索其他信息,並實施了一些答案。但是,它仍然無法正常工作。ListView:空指針異常

誤差特別是

的NullPointerException在管線76在MainActivity

這是我的MainActivity

import java.util.ArrayList; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 

public class MainActivity extends Activity { 

    final ArrayList<String> studentName = new ArrayList<String>(); 

    ArrayAdapter<String> aa; 

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



     ListView myList = (ListView) findViewById(R.id.listName); 

     aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, studentName); 

     myList.setAdapter(aa); 


     //droid.R.id.list; 

     //add 
     Button bAdd = (Button) findViewById(R.id.addstudent); 
     bAdd.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent("android.intent.action.ADDSTUDENTS")); 
      } 
     }); 


     //edit 

     Button bEdit = (Button) findViewById(R.id.editstudent); 
     bEdit.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View x) { 
       startActivity(new Intent("android.intent.action.EDITSTUDENTS")); 
      } 
     }); 

     //edit 

     Button bDelete = (Button) findViewById(R.id.deletestudent); 
     bDelete.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View x) { 
       startActivity(new Intent("android.intent.action.DELETESTUDENTS")); 
       } 
      }); 


    } 

    public ArrayList<String> getArray(){ 
     return studentName; 
    } 

    public void notifyArray(){ 
     aa.notifyDataSetChanged(); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

} 

和線76的方式的代碼是

aa.notifyDataSetChanged(); 

這裏是我的AddStudents類

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class AddStudents extends Activity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.add_student); 

     Button bAddStudents = (Button) findViewById(R.id.add); 
     final EditText et = (EditText) findViewById(R.id.student_name); 

     bAddStudents.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 

       MainActivity as = new MainActivity(); 

       as.getArray().add(et.getText().toString()); 
       as.notifyArray(); 
       finish(); 

      } 


     }); 

     Button bBack = (Button) findViewById(R.id.backadd); 

     bBack.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 

       finish(); 

      } 
    }); 


    } 

} 

,並在列表視圖中的XML部分代碼是

<ListView 
      android:id="@+id/listName" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" > 

     </ListView> 

我希望你能幫助我,因爲我也想學什麼我的錯誤是。如果需要,我可以添加其他信息。

+1

你有什麼'studentName'的ArrayList的價值觀對Add按鈕點擊事件

Hashtable hash = CommonHashtable.getInstance(); hash.put("NEW_STUDENT_NAME", et.getText().toString()); 

添加這個在您添加此的onResume()?你有沒有在你的數組列表中添加任何值? – GrIsHu

+0

檢查這兩個連接 http://stackoverflow.com/questions/5817202/null-pointer-exception-during-android-listview-refresh 和 http://stackoverflow.com/questions/6894613/array-adapter-notifydatasetchanged-nullpointerexception-android –

+0

@Grishu我沒有在studentName數組列表中添加任何值。在我的理解中,Cuase計劃要做的是,當AddStudent類中有一個新條目(添加studen時)時,它會自動進入studentName數組列表中。如果我錯了,請糾正我。 – NewbieLearner

回答

3

在您的AddStudents類中,您實例化MainActivity後立即致電notifyArray()MainActivity.onCreate()不會僅僅通過實例化來調用。

將您的MainActivity實例化可能不是您想要的(因爲該對象將在onClick處理程序完成後直接處理)。

你想要的是訪問MainActivity的現有實例。爲此,請將對當前實例的引用添加到您的MainActivity類的靜態成員,例如,它通過

MainActivity.activity.notifyArray() 

public class MainActivity extends Activity { 
    public static MainActivity activity; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     activity = this; 
    } 
} 

然後在您的AddStudent級接入這不是解決你的問題的最美麗的方式,但它的工作原理,只要你可以確保只有一個MainActivity實例。 (如果沒有,你可以讓數組本身是靜態的;或者爲它創建一個Singleton包裝類。)

+0

先生,謝謝你的解釋。現在我明白了這種關係爲什麼不起作用(特別是安排)。我嘗試了nmw的答案,它的工作,但列表沒有顯示(似乎是我的列表中的另一個問題)。然後我嘗試了你的答案(代碼),問題是在AddStudent類中,它在MainActivity.activity.notifyArray()中給出錯誤,特別是在notifyArray部分。 – NewbieLearner

+0

它給出了哪個錯誤? – domsom

+0

對於類型Activity,方法notifyArrays()未定義。我仔細檢查了一下,最後有一個s。 – NewbieLearner

1

notifyArray()onCreate之前被調用。

+0

onCreate之前添加notifyArray()給出一個錯誤,無法啓動活動...空指針異常 – NewbieLearner

+0

該方法的位置並不重要,我說它在* onCreate()之前被稱爲*。所以你應該看看'notifyArray()'被調用的地方,並且在'onCreate()'之後修復它。如果你懶惰的話,或者在'notifyArray()'裏面放一個'if(aa!= null)'檢查。 – nmw

+0

我明白了。對不起,我誤以爲你的第一條評論。現在看它。 – NewbieLearner

0

嘗試調用getArray()。add(et.getText()。toString());和notifyArray();在MainActivity的onResume()中,而不是從AddStudentActivity(不推薦!)

所以onResume()你最好想添加一個新的學生到列表中,所以在你的情況下,你可以使用像散列表或類似的常見可共享對象來檢索學生姓名,使它成爲一個單身人士,並用它從任何地方在applciation

公共類可能會是這樣的:

class CommonHashtable{ 

private static Hashtable<String, Object> commonHashtable = null; 

public static getInstance(){ 
    if(commonHashtable == null) 
     commonHashtable = new Hashtable<String, Object>(); 

    return commonHashtable; 
} 

上的getInstance(),它返回一個commonHashtable可以暫時用來存儲值!

所以,MainActivity

Hashtable hash = CommonHashtable.getInstance(); 
Object studentName = (String) hash.get("NEW_STUDENT_NAME"); 

if(studentName != null){ 
    notifyArray(); 
} 
+0

讓我試試這個。 – NewbieLearner

+0

體系結構明智我不會推薦這樣做:它引入了一種隱式的基於數據的依賴性和代碼混亂,在沒有必要的地方。我的兩分錢:如果您將數據操作留在'StudentClass'中,並且只將通知移動到'MainActivity',則可以使用廣播意圖觸發該操作,或者在MainActivity.onResume()中調用'notifyArray()'無條件的。 – domsom