空指针异常:尝试调用虚拟方法'void

问题描述:

我有我的代码问题。我正在学习如何使用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

试试这个 -

交叉检查ListView标识在activity_main.xml

+0

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

首先,我认为你不应该创建一个新的ada在回调中。这是一个糟糕的设计。当您更改数据时,您可以通知您的适配器。 我认为问题在于您可能会在收到回复之前收到回复, G。在配置更改期间(如设备旋转)。

您应该意识到生命周期。有一些技术可以使它更容易,如LiveData

总结:不要在回调中创建新的适配器。更改数据并使用notifyDataSetChanged()通知适配器。不要忘记在拆除活动/片段时注销听众,并检查视图是否存在。