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页面的底部)。