1

私はAndroidアプリケーションを開発するのがまったく新しく、アプリがクラッシュする理由を理解できません。ここでは、コードがあります:Android - データベースにアイテムを追加しようとするとアプリケーションがクラッシュする

public class ProductListActivity extends ListActivity { 

private ProductDataSource datasource; 
private ListView lv; 
private ArrayAdapter<Product> adapter; 

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

    datasource = new ProductDataSource(this); 
    datasource.open(); 

    datasource.deleteAllProducts(); 

    List<Product> values = datasource.getAllProducts(); 
    lv = (ListView) findViewById(android.R.id.list); 

    adapter = new ArrayAdapter<Product>(
      this, 
      android.R.layout.simple_list_item_1, 
      values); 
    lv.setAdapter(adapter); 
} 

private void addListenerOnAddNewProductButton() { 
    Button btn = (Button) findViewById(R.id.add_new); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      EditText addProductInput = (EditText) findViewById(R.id.add_product_text); 
      String newProductName = addProductInput.getText().toString(); 
      Product addedProduct = datasource.createProduct(newProductName); 

      ArrayAdapter<Product> adapter = (ArrayAdapter<Product>) getListAdapter(); 
      adapter.add(addedProduct); 

      Toast.makeText(getApplicationContext(), "Product added", Toast.LENGTH_LONG).show(); 
      addProductInput.setText(""); 
     } 
    }); 
} 

製品がデータベースに追加された理由を私は理解していないと、まだ私はnullオブジェクトのメソッドを呼び出すためにしようとしている私に告げるエラーが発生します。

エラー:私はすでにここSO上で同様のトピックを見てきましたが、それは私を助けていない

Attempt to invoke virtual method 'void android.widget.ArrayAdapter.add(java.lang.Object)' on a null object reference 

- あなたが見ることができるように、私はこのクラスのグローバル変数としての私のアダプタを宣言しました。どうしたの?

+0

我々が見ることができます 'getListAdapter()'メソッドを? –

+0

実際、私はそれを実装しませんでした。私はこのチュートリアルをやっています:http://www.vogella.com/tutorials/AndroidSQLite/article.html#tutorial-using-sqlite – TheOpti

+0

私はあなたのために働いたそのメソッドを削除することを参照してください私は、 adapter'は、nullを返す原因となるメソッドなしでできるインスタンス変数です。 –

答えて

0

試してみてください。代わりに

adapter = (ArrayAdapter<Product>) getListAdapter(); 

ArrayAdapter<Product> adapter = (ArrayAdapter<Product>) getListAdapter(); 

と変更:

private ArrayAdapter<Product> adapter; 

へ:

public ArrayAdapter<Product> adapter; 
+0

幸いにもgetListAdapter.Whで行を削除すると動作しますか? – TheOpti

+0

更新後もまだ動作しません。 onClickメソッド内でアダプタを取得せずに私のバージョンが動作します。どうして? – TheOpti

2

ListViewの代わりにListActivitysetListAdapterメソッドを使用する必要があります。

のonCreateでは、あなたが行うことができます:

setListAdapter(adapter); 

代わりの

lv.setAdapter(adapter); 
+0

実際、動作します。これら2つの方法の違いは何ですか? – TheOpti

+1

lv.setAdapter(adapter)は、アクティビティではなくListViewにアダプタを設定します。 getListAdapterはアクティビティからアダプタを取得します。この場合はnullです。 – azEf

+0

@TheOptiあなたは 'ListActivity'を持っているので、クラス内の' lv'や 'adapter'への参照は必要ありません。 'getListView()'と 'getListAdapter()'をそれぞれ使用します –

関連する問題