Help I have the following error in an activity that lists data in a ListView

1

The error that is thrown is the following:

  

E / AndroidRuntime: FATAL EXCEPTION: main       Process: com.example.bastiancorps.geoassistance, PID: 17445       java.lang.RuntimeException: Unable to start activity ComponentInfo {com.example.bastiancorps.geoassistance / com.example.bastiancorps.geoassistance.productoActivity}:   java.lang.NullPointerException: Attempt to invoke virtual method   'com.google.firebase.database.DatabaseReference   com.google.firebase.database.DatabaseReference.child (java.lang.String) '   on a null object reference

This is the code of the activity:

public class productoActivity extends AppCompatActivity {
    private List<producto> listaproductos = new ArrayList<producto>();
    ArrayAdapter<producto> arrayAdapterproducto;
    private EditText codigop, nombrep, preciop, stockp, tiendap;
    private FirebaseDatabase midb;
    private DatabaseReference midr;
    private ProgressDialog progressDialog;
    private FirebaseAuth mAuth;
    private ListView milistap;
    producto productosected;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_producto);
        listarDatosproducto();
        codigop = (EditText) findViewById(R.id.ETcodigop);
        nombrep = (EditText) findViewById(R.id.ETnombrep);
        preciop = (EditText) findViewById(R.id.ETpreciop);
        stockp = (EditText) findViewById(R.id.ETstockp);
        tiendap = (EditText) findViewById(R.id.ETtiendap);
        milistap = (ListView) findViewById(R.id.listadeproductos);
        progressDialog = new ProgressDialog(this);
        mAuth = FirebaseAuth.getInstance();
        midb = FirebaseDatabase.getInstance();
        midr = FirebaseDatabase.getInstance().getReference();

        milistap.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                productosected = (producto) parent.getItemAtPosition(position);
                //codigop.setText(productosected.getCodigo());
                nombrep.setText(productosected.getNombre());
                preciop.setText(productosected.getPrecio());
                stockp.setText(productosected.getStock());
                tiendap.setText(productosected.getTienda());
            }
        });
    }

    private void listarDatosproducto() {
        midr.child("producto").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                listaproductos.clear();
                for (DataSnapshot datasnap : dataSnapshot.getChildren()){
                    producto p = datasnap.getValue(producto.class);
                    listaproductos.add(p);
                    arrayAdapterproducto = new ArrayAdapter<producto>(productoActivity.this, android.R.layout.simple_list_item_1, listaproductos);
                    milistap.setAdapter(arrayAdapterproducto);
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

this is the Xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="12dp"
    tools:context=".productoActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="10dp"
        android:text="Ingrese un producto"
        android:textSize="22dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteY="0dp" />

    <EditText
        android:id="@+id/ETcodigop"
        android:layout_width="336dp"
        android:layout_height="35dp"
        android:layout_marginEnd="8dp"
        android:background="@drawable/txt_color"
        android:hint="codigo"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.6"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.109"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/ETnombrep"
        android:layout_width="336dp"
        android:layout_height="35dp"
        android:background="@drawable/txt_color"
        android:hint="nombre del producto"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.207"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/ETpreciop"
        android:layout_width="337dp"
        android:layout_height="35dp"
        android:layout_marginEnd="8dp"
        android:background="@drawable/txt_color"
        android:hint="precio de venta"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.615"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.296"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/ETstockp"
        android:layout_width="336dp"
        android:layout_height="35dp"
        android:background="@drawable/txt_color"
        android:hint="Stock"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.38"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/ETtiendap"
        android:layout_width="336dp"
        android:layout_height="35dp"
        android:layout_marginEnd="8dp"
        android:background="@drawable/txt_color"
        android:hint="tienda"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.55"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.474"
        tools:ignore="MissingConstraints" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="10dp"
        android:text="Lista de productos"
        android:textSize="22dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.586"
        tools:ignore="MissingConstraints" />

   <ListView
       android:id="@+id/listadeproductos"
       android:layout_width="match_parent"
       android:layout_height="match_parent"></ListView>

</LinearLayout>
    
asked by Bastian 19.12.2018 в 06:22
source

2 answers

1

The problem could be that you call the listarDatosproducto() function before instantiating what the midr variable is. This means that at the moment you try to create the event, the application does not know what midr is.

The solution would be to call the function listarDatosproducto() after instantiating the variable midr .

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_producto);
        //listarDatosproducto(); esto habría que moverlo más abajo
        codigop = (EditText) findViewById(R.id.ETcodigop);
        nombrep = (EditText) findViewById(R.id.ETnombrep);
        preciop = (EditText) findViewById(R.id.ETpreciop);
        stockp = (EditText) findViewById(R.id.ETstockp);
        tiendap = (EditText) findViewById(R.id.ETtiendap);
        milistap = (ListView) findViewById(R.id.listadeproductos);
        progressDialog = new ProgressDialog(this);
        mAuth = FirebaseAuth.getInstance();
        midb = FirebaseDatabase.getInstance();
        midr = FirebaseDatabase.getInstance().getReference();

        listarDatosproducto(); //Aquí la aplicación ya sabe lo que es el midr

        milistap.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                productosected = (producto) parent.getItemAtPosition(position);
                //codigop.setText(productosected.getCodigo());
                nombrep.setText(productosected.getNombre());
                preciop.setText(productosected.getPrecio());
                stockp.setText(productosected.getStock());
                tiendap.setText(productosected.getTienda());
            }
        });
    }
    
answered by 19.12.2018 в 08:19
0

Adding to the solution of Iñigo that is correct, so that you are better reflected the elements that you load in the list, set the adapter and create it after looping and get all the data for the list

change this

for (DataSnapshot datasnap : dataSnapshot.getChildren()){
                producto p = datasnap.getValue(producto.class);
                listaproductos.add(p);
                arrayAdapterproducto = new ArrayAdapter<producto>(productoActivity.this, android.R.layout.simple_list_item_1, listaproductos);
                milistap.setAdapter(arrayAdapterproducto);
            }

for this

  for (DataSnapshot datasnap : dataSnapshot.getChildren()){
                    producto p = datasnap.getValue(producto.class);
                    listaproductos.add(p);

                }
                    arrayAdapterproducto = new ArrayAdapter<producto>(productoActivity.this, android.R.layout.simple_list_item_1, listaproductos);
                    milistap.setAdapter(arrayAdapterproducto);

In this way you prevent you from setting one piece at a time in your listview while you loop and set them all at once when it ends.

    
answered by 19.12.2018 в 13:09