空对象引用上的java.util.ArrayList.size()'

Yun*_*dar 1 android firebase android-recyclerview

我想从Firebase数据库中提取数据.我的表名是"cardornek".我设置了读/写权限.

但我得到这个"java.util.ArrayList.size()"对空对象引用"错误.任何的想法?

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

private ArrayList<String> values=null;
RecyclerViewAdapter(ArrayList<String> values) {
    this.values = values;
}
@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item,parent,false));
}


@Override
public void onBindViewHolder(RecyclerViewAdapter.ViewHolder holder, int position)
{
    holder.name.setText(values.get(position));
}

@Override
public int getItemCount() {
    return values.size();
}

public class ViewHolder extends RecyclerView.ViewHolder
{
    private TextView name;
    ViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.list_item_text);
    }
}
Run Code Online (Sandbox Code Playgroud)

MainActivity.java

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    new GetDataFromFirebase().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

    // Read from the database
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("cardornek");

    myRef.addValueEventListener(new ValueEventListener() {


        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ArrayList<String> values = (ArrayList<String>) dataSnapshot.getValue();
            recyclerView.setAdapter(new RecyclerViewAdapter(values));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("Failed to read value." + databaseError.toException());
        }
    });
Run Code Online (Sandbox Code Playgroud)

Laj*_*pad 7

您的问题是,(ArrayList<String>) dataSnapshot.getValue()有时候null,在存储值之后,会抛出异常getItemCount.如果你可以在值为0时返回0作为大小null,那么解决方案是

@Override
public int getItemCount() {
    return (values == null) ? 0 : values.size();
}
Run Code Online (Sandbox Code Playgroud)

但是,您可能想知道为什么dataSnapshot.getValue可以返回null.也许那是真正的问题而且NullPointerException只是症状.