1

저는 안드로이드 응용 프로그램을 개발하는 것에 완전히 익숙하지 않아, 왜 내 응용 프로그램이 충돌하는지 이해하지 못합니다.안드로이드 - 데이터베이스에 항목을 추가하려고 할 때 응용 프로그램이 중단됩니다.

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(""); 
     } 
    }); 
} 

제품은 데이터베이스에 추가 아직도 내가 널 객체의 메소드를 호출하려고 말해 오류를 수신하고 왜 이해가 안 : 여기에 코드입니다.

오류 : 이미 여기에 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 중 하나를 사용하는 대신 ListActivity에서 setListAdapter 메서드를 사용해야합니다.

에서 onCreate, 당신은 할 수 있습니다 :

setListAdapter(adapter); 

대신

lv.setAdapter(adapter); 
+0

사실, 작동합니다.이 두 가지 방법의 차이점은 무엇입니까? – TheOpti

+1

lv.setAdapter (adapter)는 Activity가 아닌 ListView에 어댑터를 설정합니다. getListAdapter는 활동에서 어댑터를 가져 오며, 사용자의 경우 null입니다. – azEf

+0

@TheOpti 당신이'ListActivity'를 가지고 있기 때문에, 당신은 당신의 클래스에서'lv' 또는'adapter'에 대한 참조가 필요 없습니다. 당신은'getListView()'와'getListAdapter()'를 각각 사용한다. –

관련 문제