Android 创建新项目后重新加载listView

Android 创建新项目后重新加载listView,android,sqlite,listview,Android,Sqlite,Listview,我试图让我的应用程序在向数据库添加新数据之后返回listview活动。但每次我尝试调用notifyDataSetChanged()命令时,应用程序都会崩溃 主要活动是: Button createTerm; ListView termList; TextView emptyList; Cursor cursor; SQLiteDatabase db = null; ListViewAdapter termListAdapter = null; @Override protected void

我试图让我的应用程序在向数据库添加新数据之后返回listview活动。但每次我尝试调用notifyDataSetChanged()命令时,应用程序都会崩溃

主要活动是:

Button createTerm;
ListView termList;
TextView emptyList;
Cursor cursor;
SQLiteDatabase db = null;
ListViewAdapter termListAdapter = null;

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

    db = new DatabaseHelper(this).getWritableDatabase();

    createTerm = (Button) findViewById(R.id.btn_createTerm);
    termList = (ListView) findViewById(R.id.lv_termList);
    // What when there are no terms.
    termList.setEmptyView((TextView) findViewById(R.id.tv_emptyTermList));

    // Create the cursor to populate the listview;
    cursor = db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_TERM, null);

    // Options for the on Term View Click Menu
    final String options[] = { "View", "Delete" };
    final ArrayAdapter<String> termMenuAdapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, options);
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);

    // Set a cursor adapter to my list.
    termListAdapter = new ListViewAdapter(this, cursor, false, 1);
    termList.setAdapter(termListAdapter);

    // If I click on the "New Term" button.
    createTerm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Context c = v.getContext();
            Intent i = new Intent(c, CreateTermWindow.class);
            startActivityForResult(i, 1);
        }
    });

// When we finish creating a new Term.
@Override
protected void onActivityResult(int request, int result, Intent data) {
    if(request == 1){
        termListAdapter.notifyDataSetChanged();
    }
}
日志:

04-15 12:35:08.509: W/dalvikvm(14846): threadid=1: thread exiting with uncaught exception (group=0x40da61f8)
04-15 12:35:08.529: E/AndroidRuntime(14846): FATAL EXCEPTION: main
04-15 12:35:08.529: E/AndroidRuntime(14846): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at com.dagonar.achievegpa.helperclass.ListViewAdapter.bindView(ListViewAdapter.java:46)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:256)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.AbsListView.obtainView(AbsListView.java:2460)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.ListView.makeAndAddView(ListView.java:1772)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.ListView.fillDown(ListView.java:672)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.ListView.fillFromTop(ListView.java:732)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.ListView.layoutChildren(ListView.java:1611)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.AbsListView.onLayout(AbsListView.java:2290)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.View.layout(View.java:11338)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:980)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.View.layout(View.java:11338)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.View.layout(View.java:11338)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1658)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1516)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1429)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.View.layout(View.java:11338)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.View.layout(View.java:11338)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1493)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2452)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.os.Looper.loop(Looper.java:137)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.app.ActivityThread.main(ActivityThread.java:4464)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at java.lang.reflect.Method.invokeNative(Native Method)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at java.lang.reflect.Method.invoke(Method.java:511)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:822)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at dalvik.system.NativeStart.main(Native Method)

在尝试从中读取数据之前,是否调用了
cursor.movetoforst(…)
cursor.moveToFirst()
?从您的日志中:

android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)

调用适配器。notifyDataSetChanged()

最好将内容提供程序与AsyncTaskLoader一起使用。错误是什么,为什么人们没有足够的知识来放置stacktrace,如果他们有一个Crashall,那么您必须从UI线程调用notifyDataSetChanged()。我现在正在试验这一点。我正在使用cursor.movetofsrt()。在这之后,我不再调用notifyDataSetChanged(),而是调用termListAdapter.swapCursor(游标)。当我在适配器的bindView方法中调用te moveToFirst()时,应用程序似乎可以工作。
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
04-15 12:35:08.529: E/AndroidRuntime(14846):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)