2017-07-02 106 views
-1

我有我的代碼問題。我正在學習如何使用Android創建Simple Firebase CRUD應用程序。這裏是我的MainActivity代碼:空指針異常:嘗試調用虛擬方法'void

package com.ogigpermana.crudfirebaseapp; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Spinner; 
import android.widget.Toast; 

import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 
import com.ogigpermana.crudfirebaseapp.adapter.ArtistList; 
import com.ogigpermana.crudfirebaseapp.model.Artist; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 
    EditText editTextName; 
    Button buttonAdd; 
    Spinner spinnerGenres; 

    DatabaseReference databaseArtists; 
    ListView listViewArtists; 
    List<Artist> artistList; 

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

     databaseArtists = FirebaseDatabase.getInstance().getReference("artists"); 

     editTextName = (EditText) findViewById(R.id.editTextName); 
     buttonAdd = (Button) findViewById(R.id.buttonAddArtist); 
     spinnerGenres = (Spinner) findViewById(R.id.spinnerGenres); 

     listViewArtists = (ListView) findViewById(R.id.listViewArtists); 

     artistList = new ArrayList<>(); 

     buttonAdd.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       addArtist(); 
      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     databaseArtists.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       artistList.clear(); 

       for (DataSnapshot artistSnapshot: dataSnapshot.getChildren()){ 
        Artist artist = artistSnapshot.getValue(Artist.class); 

        artistList.add(artist); 
       } 

       ArtistList adapter = new ArtistList(MainActivity.this, artistList); 

       listViewArtists.setAdapter(adapter); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

    private void addArtist(){ 
     String name = editTextName.getText().toString().trim(); 
     String genre = spinnerGenres.getSelectedItem().toString(); 

     if (!TextUtils.isEmpty(name)){ 

      String id = databaseArtists.push().getKey(); 

      Artist artist = new Artist(id, name, genre); 

      databaseArtists.child(id).setValue(artist); 

      Toast.makeText(this, "Artis berhasil ditambah", Toast.LENGTH_LONG).show(); 

     }else{ 
      Toast.makeText(this, "Nama tidak boleh kosong", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

這裏是顯示當我運行錯誤代碼:

07-03 00:30:45.727 30907-30907/com.ogigpermana.crudfirebaseapp Ë/AndroidRuntime:致命異常:主

過程:com.ogigpermana.crudfirebaseapp,PID:30907

顯示java.lang.NullPointerException:嘗試調用虛擬方法「無效 android.wi dget.ListView.setAdapter(android.widget.ListAdapter)」上的 空對象引用 在 com.ogigpermana.crudfirebaseapp.MainActivity $ 2.onDataChange(MainActivity.java:72) 在com.google.android.gms.internal在Android的.zzbmz.zza(來源不明) 在com.google.android.gms.internal.zzbnz.zzYj(來源不明) 在com.google.android.gms.internal.zzboc $ 1.run(來源不明) .os.Handler.handleCallback(Handler.java:739) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:148) 在安德烈oid.app.ActivityThread.main(ActivityThread.java:5441) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java: 738) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)

+0

u需要在onCreate中創建ArtistList的第一個init構造函數.. – marlonpya

回答

1

試試這個 -

交叉檢查ListView標識在activity_main.xml

+0

非常感謝您的回答,我錯了地方放了ListView ... #CaseClosed –

0

首先,我認爲你不應該創建一個新的ada在回調中。這是一個糟糕的設計。當您更改數據時,您可以通知您的適配器。 我認爲問題在於您可能會在收到回覆之前收到回覆, G。在配置更改期間(如設備旋轉)。

您應該意識到生命週期。有一些技術可以使它更容易,如LiveData

總結:不要在回調中創建新的適配器。更改數據並使用notifyDataSetChanged()通知適配器。不要忘記在拆除活動/片段時註銷聽衆,並檢查視圖是否存在。

相關問題