7

我是新手,並試圖讓我的ListView在更新SQLite數據庫後刷新。在修改我的onResume()方法後,我沒有收到編譯錯誤。我正在使用SimpleCursorAdapter進行重新查詢,但不起作用。收到的錯誤來自logcat並且在下面。請指教...例子最好。無法恢復活動

logcat的:

02-19 21:31:49.933: E/AndroidRuntime(714): java.lang.RuntimeException: Unable to resume activity {com.loginplus.home/com.loginplus.home.LoginList}: java.lang.NullPointerException 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2444) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1986) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.os.Handler.dispatchMessage(Handler.java:99) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.os.Looper.loop(Looper.java:137) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.main(ActivityThread.java:4424) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at java.lang.reflect.Method.invokeNative(Native Method) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at java.lang.reflect.Method.invoke(Method.java:511) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at dalvik.system.NativeStart.main(Native Method) 
    02-19 21:31:49.933: E/AndroidRuntime(714): Caused by: java.lang.NullPointerException 
    02-19 21:31:49.933: E/AndroidRuntime(714): at com.loginplus.home.LoginList.onResume(LoginList.java:101) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1154) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.Activity.performResume(Activity.java:4539) 
    02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434) 

活動:

 public class LoginList extends Activity implements OnClickListener, OnItemClickListener { 

private ListView loginList; 
private Button webLogin; 

private ListAdapter loginListAdapter; 

private ArrayList<LoginDetails> loginArrayList; 

List<String> arrayList = new ArrayList<String>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    arrayList = populateList(); 
    loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList()); 
    setContentView(R.layout.login_listview); 


    loginList = (ListView) 
    findViewById(R.id.loginlist); 
    loginList.setOnItemClickListener(this); 

    webLogin = (Button) 
    findViewById(R.id.button3); 
    webLogin.setOnClickListener(this); 


} 

@Override 
public void onClick (View v) { 
    Intent webLoginIntent = new Intent (this, LoginPlusActivity.class); 
    startActivity(webLoginIntent); 

} 

public List<String> populateList(){ 

    List<String> webNameList = new ArrayList<String>(); 

    dataStore openHelperClass = new dataStore (this); 

    SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase(); 

    Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); 

    startManagingCursor(cursor); 


    while (cursor.moveToNext()){ 
    String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE)); 
    String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS)); 
    String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME)); 
    String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD)); 
    String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES)); 

    LoginDetails lpDetails = new LoginDetails(); 

     lpDetails.setsName(sName); 
     lpDetails.setwUrl(wUrl); 
     lpDetails.setuName(uName); 
     lpDetails.setpWord(pWord); 
     lpDetails.setlNotes(lNotes); 

     loginArrayList.add(lpDetails); 
     webNameList.add(sName); 
} 

sqliteDatabase.close(); 
return webNameList; 
} 



@Override 
protected void onResume() { 
    super.onResume(); 

    loginArrayList.clear(); 

    arrayList.clear(); 

    arrayList = populateList(); 

    dataStore refreshHelper = new dataStore (this); 
    SQLiteDatabase sqliteDatabase = refreshHelper.getWritableDatabase(); 
    Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); 
    String[]columns = new String[] { dataStore.COLUMN_NAME_SITE, dataStore.COLUMN_NAME_ADDRESS, dataStore.COLUMN_NAME_USERNAME, dataStore.COLUMN_NAME_PASSWORD, dataStore.COLUMN_NAME_NOTES }; 
    int[] to = new int[]{R.id.rusName, R.id.ruwUrl, R.id.ruuName, R.id.rupWord, R.id.ruNotes}; 
    SimpleCursorAdapter loginListAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, columns, to); 
    loginListAdapter.notifyDataSetChanged(); 

} 

@Override 
public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) { 
    Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show(); 

    Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class); 



    LoginDetails clickedObject = loginArrayList.get(arg2); 

     Bundle loginBundle = new Bundle(); 
    loginBundle.putString("clickedWebSite",clickedObject.getsName()); 
    loginBundle.putString("clickedWebAddress",clickedObject.getwUrl()); 
    loginBundle.putString("clickedUserName",clickedObject.getuName()); 
    loginBundle.putString("clickedPassWord",clickedObject.getpWord()); 
    loginBundle.putString("clickedNotes",clickedObject.getlNotes()); 

    updateDeleteLoginInfo.putExtras(loginBundle); 

    startActivityForResult(updateDeleteLoginInfo, 0);  
     }  
      } 

RennoDiniro EditResults:

logcat的:

 02-21 23:40:18.419: E/AndroidRuntime(705): FATAL EXCEPTION: main 
     02-21 23:40:18.419: E/AndroidRuntime(705): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.loginplus.home/com.loginplus.home.LoginList}: java.lang.NullPointerException 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.os.Handler.dispatchMessage(Handler.java:99) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.os.Looper.loop(Looper.java:137) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.main(ActivityThread.java:4424) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at java.lang.reflect.Method.invokeNative(Native Method) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at java.lang.reflect.Method.invoke(Method.java:511) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at dalvik.system.NativeStart.main(Native Method) 
     02-21 23:40:18.419: E/AndroidRuntime(705): Caused by: java.lang.NullPointerException 
     02-21 23:40:18.419: E/AndroidRuntime(705): at com.loginplus.home.LoginList.populateList(LoginList.java:88) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at com.loginplus.home.LoginList.onCreate(LoginList.java:37) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.Activity.performCreate(Activity.java:4465) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
     02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 

活動類別:

 public class LoginList extends Activity implements OnClickListener, OnItemClickListener { 

     private ListView loginList; 
     private Button webLogin; 

     private ListAdapter loginListAdapter; 

     private ArrayList<LoginDetails> loginArrayList; 

     List<String> arrayList = new ArrayList<String>(); 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList()); 
     arrayList = populateList(); 
     setContentView(R.layout.login_listview); 


     loginList = (ListView) 
     findViewById(R.id.loginlist); 
     loginList.setOnItemClickListener(this); 

     webLogin = (Button) 
     findViewById(R.id.button3); 
     webLogin.setOnClickListener(this); 
     } 

     @Override 
     public void onClick (View v) { 
     Intent webLoginIntent = new Intent (this, LoginPlusActivity.class); 
     startActivity(webLoginIntent); 
     } 

     public List<String> populateList(){ 

     List<String> webNameList = new ArrayList<String>(); 

     dataStore openHelperClass = new dataStore (this); 

     SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase(); 

     Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); 

     startManagingCursor(cursor); 


     while (cursor.moveToNext()){ 
     String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE)); 
     String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS)); 
     String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME)); 
     String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD)); 
     String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES)); 

    LoginDetails lpDetails = new LoginDetails(); 

    lpDetails.setsName(sName); 
    lpDetails.setwUrl(wUrl); 
    lpDetails.setuName(uName); 
    lpDetails.setpWord(pWord); 
    lpDetails.setlNotes(lNotes); 

    loginArrayList.add(lpDetails); 
    webNameList.add(sName); 
    } 

    sqliteDatabase.close(); 
    return webNameList; 
    } 

    @Override 
    protected void onResume() { 
    super.onResume(); 

    try{ 
    loginArrayList = new ArrayList<LoginDetails>(); 
    arrayList = new ArrayList<String>(); 
    loginArrayList.clear(); 
    arrayList.clear(); 

    arrayList = populateList(); 

    dataStore refreshHelper = new dataStore (this); 
    SQLiteDatabase sqliteDatabase = refreshHelper.getWritableDatabase(); 
    Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); 
    String[]columns = new String[] { dataStore.COLUMN_NAME_SITE, dataStore.COLUMN_NAME_ADDRESS, dataStore.COLUMN_NAME_USERNAME, dataStore.COLUMN_NAME_PASSWORD, dataStore.COLUMN_NAME_NOTES }; 
    int[] to = new int[]{R.id.rusName, R.id.ruwUrl, R.id.ruuName, R.id.rupWord, R.id.ruNotes}; 
    SimpleCursorAdapter loginListAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, columns, to); 
    loginListAdapter.notifyDataSetChanged(); 
    }catch(Exception e) 
    { 
    e.printStackTrace(); 
    } 
    } 
    @Override 
    public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) { 
    Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show(); 

    Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class); 



    LoginDetails clickedObject = loginArrayList.get(arg2); 

    Bundle loginBundle = new Bundle(); 
    loginBundle.putString("clickedWebSite",clickedObject.getsName()); 
    loginBundle.putString("clickedWebAddress",clickedObject.getwUrl()); 
    loginBundle.putString("clickedUserName",clickedObject.getuName()); 
    loginBundle.putString("clickedPassWord",clickedObject.getpWord()); 
    loginBundle.putString("clickedNotes",clickedObject.getlNotes()); 

    updateDeleteLoginInfo.putExtras(loginBundle); 

    startActivityForResult(updateDeleteLoginInfo, 0); 
    } 
    } 
+0

你的onPause()在哪裏? – 2013-02-20 19:17:36

+0

哪一行是你的onResume方法中的101行 – Nickolaus 2013-02-21 21:35:45

+0

否onPause()Sergry – user1165694 2013-02-22 00:42:01

回答

0

看來,光標爲空,一個快速的方法來解決這個問題,讓你的應用程序的運行是改變:

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor,null,null); 
mAdapter.notifyDataSetChanged(); 

if (cursor != null) { 
    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor,null,null); 
    mAdapter.notifyDataSetChanged(); 
} 

否則,它看起來像你的光標可以爲空,你可以用錯誤的投影查詢。

+0

使用您的建議後會收到同樣的錯誤。 02-12 14:48:38.904:E/AndroidRuntime(646):引起:java.lang.NullPointerException 02-12 14:48:38.904:E/AndroidRuntime(646):\t at android.widget.SimpleCursorAdapter.findColumns (SimpleCursorAdapter.java:327) 02-12 14:48:38。904:E/AndroidRuntime(646):\t at android.widget.SimpleCursorAdapter。 (SimpleCursorAdapter.java:81) 02-12 14:48:38.904:E/AndroidRuntime(646):\t at com.loginplus.home.LoginList.onResume(LoginList.java:105) 02-12 14:48 :38.904:E/AndroidRuntime(646): – user1165694 2013-02-12 19:51:28

0

您需要提供從列名的映射在SimpleCursorAdapter構造函數資源ID - 在fromto參數,你傳遞空爲此。

3

使用指向所需數據的光標和佈局信息創建適配器。

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, columns, to); 

在你的情況爲uř使用R.layout.simple_list_item_1

columnsnullParticular column data which you get from cursor

toandroid.R.id.text1


對於例如

Cursor cursor = getContentResolver().query(People.CONTENT_URI, new String[]{People._ID, People.NAME, People.NUMBER}, null, null, null); 
    startManagingCursor(cursor); 
    // THE DESIRED COLUMNS TO BE BOUND 

    String[] columns = new String[] { People.NAME, People.NUMBER }; 

    // THE XML DEFINED VIEWS WHICH THE DATA WILL BE BOUND TO 
    int[] to = new int[] { R.id.name_entry, R.id.number_entry }; 

     SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this,R.layout.list_example_entry, cursor, columns, to); 
+0

感謝您的建議。我已經實現了它們,現在收到一個nullPointerException。請參閱修訂的代碼。 – user1165694 2013-02-20 04:09:24

0

的問題是管理光標 -

startManagingCursor(cursor); 

儘量保持自己的光標,而不是使用「活動管理」,這是過時的光標。

2天前,我在管理遊標後使用onResume調用發送完全相同的問題。

0

你永遠不會初始化loginArrayList(因此它是null)。

+0

initialized loginArrayList with:ArrayList loginArrayList = new ArrayList (); .........現在收到logcat錯誤:02-19 22:47:29.336:E/AndroidRuntime(1160):引起:java.lang.NullPointerException 02-19 22:47:29.336:E/AndroidRuntime(1160):\t at com.loginplus.home.LoginList.populateList(LoginList.java:87)... line 87 is loginArrayList.add(lpDetails); – user1165694 2013-02-22 01:00:44

+0

@ user1165694在第87行之前試試這個:'if(loginArrayList == null){Log.d(「test」,「loginArrayList is NULL」);} else {if(lpDetails == null){Log.d(「test 「,」lpDetails爲NULL「);}}'。那麼logcat打印什麼呢? – Phil 2013-02-22 04:23:27

+0

當我在第87行上面添加這段代碼時,我收到{Log.d(「test」,「lpDetails is NULL」);}}的黃線,其中說:Dead Code? – user1165694 2013-02-22 17:07:26

1

注意,你就是永遠實例loginArrayList,因此當您嘗試你的onResume()內訪問它,它是零,因此崩潰。在訪問它之前實例化它。

更新22/02/2013:

啊,你忘了實例化loginArrayList當應用程序運行在第一個的。

在你onCreate(),將下面的代碼只是super.OnCreate(...)

loginArrayList = new ArrayList<LoginDetails>(); 

後,所以它看起來像:

loginArrayList = new ArrayList<LoginDetails>(); 
loginListAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,populateList()); 
arrayList = populateList(); 
setContentView(R.layout.login_listview); 


//rest of your code... 

進行快速調整,讓您的應用程序運行如下,但請注意,爲了解決這個問題,需要對整個暫停和恢復過程中丟失的信息進行更深入的分析。

在您onResume(),做

try{ 

// your code 

}catch(Exception e) 
{ 
//Have the printStackTrace to the problems see what's going on without crashing. 
//e.printStackTrace(); 
} 

但這並不解決問題呢,

onResume()。 執行以下操作:

  • 當您第一次獲取數據時,將其存儲到數據庫中。
  • 在onResume()中重新創建列表並使用存儲在數據庫中的數據對其進行更新。

所以開始你了

@Override 
protected void onResume() { 
    super.onResume(); 


loginArrayList = new ArrayList<LoginDetails>(); 
arrayList = new ArrayList<String>(); 

arrayList = populateList(); 

// any other code you require to be done after the list is populated. 
} 

好運。

+0

我已將您的更改與logcat錯誤一起添加到我的代碼中 – user1165694 2013-02-22 05:09:50

+0

Where?我不認爲你已經更新過,因爲這個問題看起來與舊代碼相同...... – rennoDeniro 2013-02-22 14:50:36

+0

通過使用編輯工具將我的修改後的代碼添加到了您的帖子中,但沒有顯示任何內容。現在已經添加了一切到我的文章。第88行:是loginArrayList.add(lpDetails);和第37行:是loginListAdapter = new ArrayAdapter (this,android.R.layout.simple_list_item_1,populateList()); – user1165694 2013-02-22 16:55:09

3

顯然你不初始化ArrayList。但是..爲您的情況考慮使用Loader來代替。 ApiDemos中有完整的例子(列在Loader頁面的底部)。