2015-07-19 95 views
0

我一直关注Google开发人员tutorials关于创建一个应用程序来存储添加项目到数据库并将它们回收到listView,但他们正在使用ListActivity来扩展它们的MainActivity,我使用我的BaseActivity来扩展MainActivity。我在将适配器传递给List时出错。此外我的simpleCursorAdapter和startManagingCursor被剥离。SimpleCursorAdapter无法正常工作

这里是我的代码:

import com.dusandimitrijevic.data.GroceryDbAdapter; 

import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 
import android.view.ContextMenu; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.ListView; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.widget.AdapterView.AdapterContextMenuInfo; 

public class MainActivity extends BaseActivity { 
    private static final int ACTIVITY_CREATE=0; 
    private static final int ACTIVITY_EDIT=1; 

    private static final int INSERT_ID = Menu.FIRST; 
    private static final int DELETE_ID = Menu.FIRST + 1; 

    private GroceryDbAdapter mDbHelper; 

    Button addItem; 
    private Toolbar toolbar; 
    private ListView listView; 

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

     FrameLayout frameLayout = (FrameLayout)findViewById(R.id.frame_container); 

     // inflate the custom activity layout 
     LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View activityView = layoutInflater.inflate(R.layout.activity_main, null,false); 

     frameLayout.addView(activityView); 

     // Setting toolbar 
     toolbar = (Toolbar) findViewById(R.id.app_bar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 

     mDbHelper = new GroceryDbAdapter(this); 
     mDbHelper.open(); 


     // Locate ListView 
     listView = (ListView) findViewById(R.id.list); 

     fillData(); 

     addItem = (Button) findViewById(R.id.button1); 
     addItem.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(MainActivity.this, AddActivity.class); 
       startActivity(intent); 
       overridePendingTransition(R.anim.slide_in, R.anim.slide_out); 

      } 
     }); 

    } 

    @SuppressWarnings("deprecation") 
    private void fillData() { 
     Cursor itemsCursor = mDbHelper.fetchAllItems(); 
     startManagingCursor(itemsCursor); 

     // Create an array to specify the fields we want to display in the list (only TITLE) 
     String[] from = new String[]{GroceryDbAdapter.KEY_TITLE}; 

     // and an array of the fields we want to bind those fields to (in this case just text1) 
     int[] to = new int[]{R.id.title}; 

     // Now create a simple cursor adapter and set it to display 
     SimpleCursorAdapter items = 
      new SimpleCursorAdapter(this, R.layout.list_item_row, itemsCursor, from, to); 
     listView.setAdapter(items); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     menu.add(0, INSERT_ID, 0, "Add Item"); 
     return true; 
    } 

    public boolean onOptionsItemSelected(int featureId, MenuItem item) { 
     switch(item.getItemId()) { 
      case INSERT_ID: 
       createItem(); 
       return true; 
     } 

     return super.onMenuItemSelected(featureId, item); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.add(0, DELETE_ID, 0, "Delete Item"); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     switch(item.getItemId()) { 
      case DELETE_ID: 
       AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
       mDbHelper.deleteItem(info.id); 
       fillData(); 
       return true; 
     } 
     return super.onContextItemSelected(item); 
    } 

    private void createItem() { 
     Intent i = new Intent(this, AddActivity.class); 
     startActivityForResult(i, ACTIVITY_CREATE); 
    } 

    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Intent i = new Intent(this, AddActivity.class); 
     i.putExtra(GroceryDbAdapter.KEY_ROWID, id); 
     startActivityForResult(i, ACTIVITY_EDIT); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
     fillData(); 
    } 
} 

这是他们的代码:

/* 
* Copyright (C) 2008 Google Inc. 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.android.demo.notepad3; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.ContextMenu; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.AdapterView.AdapterContextMenuInfo; 

public class Notepadv3 extends ListActivity { 
    private static final int ACTIVITY_CREATE=0; 
    private static final int ACTIVITY_EDIT=1; 

    private static final int INSERT_ID = Menu.FIRST; 
    private static final int DELETE_ID = Menu.FIRST + 1; 

    private NotesDbAdapter mDbHelper; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.notes_list); 
     mDbHelper = new NotesDbAdapter(this); 
     mDbHelper.open(); 
     fillData(); 
     registerForContextMenu(getListView()); 
    } 

    private void fillData() { 
     Cursor notesCursor = mDbHelper.fetchAllNotes(); 
     startManagingCursor(notesCursor); 

     // Create an array to specify the fields we want to display in the list (only TITLE) 
     String[] from = new String[]{NotesDbAdapter.KEY_TITLE}; 

     // and an array of the fields we want to bind those fields to (in this case just text1) 
     int[] to = new int[]{R.id.text1}; 

     // Now create a simple cursor adapter and set it to display 
     SimpleCursorAdapter notes = 
      new SimpleCursorAdapter(this, R.layout.notes_row, notesCursor, from, to); 
     setListAdapter(notes); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     menu.add(0, INSERT_ID, 0, R.string.menu_insert); 
     return true; 
    } 

    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     switch(item.getItemId()) { 
      case INSERT_ID: 
       createNote(); 
       return true; 
     } 

     return super.onMenuItemSelected(featureId, item); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.add(0, DELETE_ID, 0, R.string.menu_delete); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     switch(item.getItemId()) { 
      case DELETE_ID: 
       AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
       mDbHelper.deleteNote(info.id); 
       fillData(); 
       return true; 
     } 
     return super.onContextItemSelected(item); 
    } 

    private void createNote() { 
     Intent i = new Intent(this, NoteEdit.class); 
     startActivityForResult(i, ACTIVITY_CREATE); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Intent i = new Intent(this, NoteEdit.class); 
     i.putExtra(NotesDbAdapter.KEY_ROWID, id); 
     startActivityForResult(i, ACTIVITY_EDIT); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
     fillData(); 
    } 
} 

编辑:

AddActivity.java:

package com.dusandimitrijevic.grocerylist; 


import com.dusandimitrijevic.data.GroceryDbAdapter; 

import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class AddActivity extends BaseActivity { 

    private Long mRowId; 
    private GroceryDbAdapter mDbHelper; 
    private EditText title_edit; 
    private EditText price_edit; 
    private Button saveButton; 

    private Toolbar toolbar; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     mDbHelper = new GroceryDbAdapter(this); 
     mDbHelper.open(); 
     setContentView(R.layout.add_activity_layout); 

     toolbar = (Toolbar) findViewById(R.id.app_bar); 
     setSupportActionBar(toolbar); 

     // Locate the EditText in add_note.xml 
     title_edit = (EditText) findViewById(R.id.titleEdit); 
     price_edit = (EditText) findViewById(R.id.priceEdit); 

     mRowId = (savedInstanceState == null) ? null : 
      (Long) savedInstanceState.getSerializable(GroceryDbAdapter.KEY_ROWID); 
     if (mRowId == null) { 
      Bundle extras = getIntent().getExtras(); 
      mRowId = extras != null ? extras.getLong(GroceryDbAdapter.KEY_ROWID) 
            : null; 
     } 

     populateFields(); 

     saveButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 
       setResult(RESULT_OK); 
       finish(); 
      } 

     }); 

    } 

    private void populateFields() { 
     if (mRowId != null) { 
      Cursor item = mDbHelper.fetchItem(mRowId); 
      startManagingCursor(item); 
      title_edit.setText(item.getString(
        item.getColumnIndexOrThrow(GroceryDbAdapter.KEY_TITLE))); 
      price_edit.setText(item.getString(
        item.getColumnIndexOrThrow(GroceryDbAdapter.KEY_PRICE))); 
     } 

    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     saveState(); 
     outState.putSerializable(GroceryDbAdapter.KEY_ROWID, mRowId); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     saveState(); 
    } 

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

    private void saveState() { 
     String title = title_edit.getText().toString(); 
     String price = price_edit.getText().toString(); 

     if (mRowId == null) { 
      long id = mDbHelper.createItem(title, price); 
      if (id > 0) { 
       mRowId = id; 
      } 
     } else { 
      mDbHelper.updateItem(mRowId, title, price); 
     } 
    } 

} 

ERROR我越来越:

这是当我的addItem按钮点击我得到的错误,但是当我在菜单选项“”添加项目”点击也没有发生“这是我在onCreateOption

07-20 00:01:45.760: E/AndroidRuntime(27613): FATAL EXCEPTION: main 
07-20 00:01:45.760: E/AndroidRuntime(27613): Process: com.dusandimitrijevic.grocerylist, PID: 27613 
07-20 00:01:45.760: E/AndroidRuntime(27613): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dusandimitrijevic.grocerylist/com.dusandimitrijevic.grocerylist.AddActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.app.ActivityThread.access$900(ActivityThread.java:177) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.os.Handler.dispatchMessage(Handler.java:102) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.os.Looper.loop(Looper.java:145) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.app.ActivityThread.main(ActivityThread.java:5942) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at java.lang.reflect.Method.invoke(Native Method) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at java.lang.reflect.Method.invoke(Method.java:372) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 
07-20 00:01:45.760: E/AndroidRuntime(27613): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
07-20 00:01:45.760: E/AndroidRuntime(27613): at com.dusandimitrijevic.grocerylist.AddActivity.onCreate(AddActivity.java:48) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.app.Activity.performCreate(Activity.java:6289) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
07-20 00:01:45.760: E/AndroidRuntime(27613): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
07-20 00:01:45.760: E/AndroidRuntime(27613): ... 10 more 
+0

发布你收到的欧元。 – JohanShogun

+0

07-19 21:04:32.912:E/AndroidRuntime(27600):java.lang.RuntimeException:无法启动活动ComponentInfo {com.dusandimitrijevic.grocerylist/com.dusandimitrijevic.grocerylist.MainActivity}:java.lang.NullPointerException:尝试在空对象引用 –

回答

1

你得到一个NullPointerException异常的原因是因为你打电话之前listView = (ListView) findViewById(R.id.list);调用listView.setAdapter(items);声明。

通话刚刚转会fillData()初始化listView调用下面:

mDbHelper = new GroceryDbAdapter(this); 
    mDbHelper.open(); 
    //fillData(); //don't call it here 

    // Locate ListView 
    listView = (ListView) findViewById(R.id.list); 

    fillData(); //call it here 

至于你的下一个NullPointerException异常,你需要初始化saveButton你打电话之前saveButton.setOnClickListener()

事情是这样的:

saveButton = (Button) findViewById(R.id.yourButtonIdHere); 

saveButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 
       setResult(RESULT_OK); 
       finish(); 
      } 

     }); 
+0

上调用虚方法'void android.widget.ListView.setAdapter(android.widget.ListAdapter)',它解决了我的问题,但现在我在我的addItem按钮上获得了一些NullPointerException,添加项目的新活动,并且我的菜单添加选项也不做任何事情。当我点击它时没有任何反应。它应该意图到我的AddActivity.class和按钮。 –

+0

我编辑了我的问题,并添加了来自AddActivity.java的代码 –

+1

@DusanDimitrijevic刚刚更新了答案,您只需要初始化您的Button。 –

1

你需要调用方法:

fillData()

这项任务后:

的ListView =(ListView控件)findViewById(R.id .LIST)。