0

here's the logcat:

08-02 00:51:18.627 15840-15840/com.cosmichawk.classpro E/AndroidRuntime: FATAL EXCEPTION: main Process: com.cosmichawk.classpro, PID: 15840 com.google.firebase.database.DatabaseException: Class java.util.ArrayList has generic type parameters, please use GenericTypeIndicator instead at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source) at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source) at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source) at com.google.android.gms.internal.firebase_database.zzku.zza(Unknown Source) at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source) at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source) at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) at com.cosmichawk.classpro.MainActivity$6.onDataChange(MainActivity.java:205) at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source) at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source) at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6186) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

And the main activity:

package com.cosmichawk.classpro;

import android.content.Intent; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; 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 java.util.ArrayList; import java.util.List;

public class MainActivity extends AppCompatActivity { public static final String ARTIST_NAME = "com.cosmichawk.classpro.artistname"; public static final String ARTIST_ID = "com.cosmichawk.classpro.artistid";

EditText editTextName,editTextAmount, editTextNumber;
Button buttonAddArtist;
ArrayList array;
ListView listViewArtists;

//a list to store all the artist from firebase database
List<Artist> artists;

//our database reference object
DatabaseReference databaseArtists;

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

    //getting the reference of artists node
    databaseArtists = FirebaseDatabase.getInstance().getReference("artists");

    //getting views
    editTextName = (EditText) findViewById(R.id.editTextName);
    editTextAmount = (EditText) findViewById(R.id.editTextAmount);
    editTextNumber = (EditText) findViewById(R.id.editTextNumber);

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

    buttonAddArtist = (Button) findViewById(R.id.buttonAddArtist);

    //list to store artists
    artists = new ArrayList<>();


    //adding an onclicklistener to button
    buttonAddArtist.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //calling the method addArtist()
            //the method is defined below
            //this method is actually performing the write operation
            addArtist();
        }
    });

    //attaching listener to listview
    listViewArtists.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            //getting the selected artist
            Artist artist = artists.get(i);

            //creating an intent
            Intent intent = new Intent(getApplicationContext(), ArtistActivity.class);

            //putting artist name and id to intent
            intent.putExtra(ARTIST_ID, artist.getArtistId());
            intent.putExtra(ARTIST_NAME, artist.getArtistName());

            //starting the activity with intent
            startActivity(intent);
        }
    });

    listViewArtists.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            Artist artist = artists.get(i);
            showUpdateDeleteDialog(artist.getArtistId(), artist.getArtistName());
            return true;
        }
    });


}

private void showUpdateDeleteDialog(final String artistId, String artistName) {

    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    LayoutInflater inflater = getLayoutInflater();
    final View dialogView = inflater.inflate(R.layout.update_dialog, null);
    dialogBuilder.setView(dialogView);

    final EditText editTextName = (EditText) dialogView.findViewById(R.id.editTextName);
    final EditText editTextAmount = (EditText) dialogView.findViewById(R.id.editTextAmount);
    final EditText editTextNumber = (EditText) dialogView.findViewById(R.id.editTextNumber);
    final Button buttonUpdate = (Button) dialogView.findViewById(R.id.buttonUpdateArtist);
    final Button buttonDelete = (Button) dialogView.findViewById(R.id.buttonDeleteArtist);

    dialogBuilder.setTitle(artistName);
    final AlertDialog b = dialogBuilder.create();
    b.show();


    buttonUpdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String name = editTextName.getText().toString().trim();
            String amount = editTextAmount.getText().toString().trim();
            String number = editTextNumber.getText().toString().trim();
            int fb = Integer.parseInt(amount);
            int rl = Integer.parseInt(number);
            int m = fb / rl;
            ArrayList array=new ArrayList();





            if (!TextUtils.isEmpty(name)) {

                for(int l=0; l<rl; l++){
                    array.add(l,m);
                }
                Toast.makeText(getBaseContext(), array+"", Toast.LENGTH_SHORT).show();
                updateArtist(artistId, name, amount, number, array);
                b.dismiss();
            }

        }
    });



    buttonDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            deleteArtist(artistId);
            b.dismiss();
        }
    });
}

private boolean updateArtist(String id, String name, String amount, String number, ArrayList array) {
    //getting the specified artist reference
    DatabaseReference dR = FirebaseDatabase.getInstance().getReference("artists").child(id);

    //updating artist
    Artist artist = new Artist(id, name, amount, number, array);
    dR.setValue(artist);
    Toast.makeText(getApplicationContext(), "Artist Updated", Toast.LENGTH_LONG).show();
    return true;
}

private boolean deleteArtist(String id) {
    //getting the specified artist reference
    DatabaseReference dR = FirebaseDatabase.getInstance().getReference("artists").child(id);

    //removing artist
    dR.removeValue();

    //getting the tracks reference for the specified artist
    DatabaseReference drTracks = FirebaseDatabase.getInstance().getReference("tracks").child(id);

    //removing all tracks
    drTracks.removeValue();
    Toast.makeText(getApplicationContext(), "Artist Deleted", Toast.LENGTH_LONG).show();

    return true;
}

@Override
protected void onStart() {
    super.onStart();
    //attaching value event listener
    databaseArtists.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            //clearing the previous artist list
            artists.clear();

            //iterating through all the nodes
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                //getting artist


                Artist artist = postSnapshot.getValue(Artist.class);
                //adding artist to the list
                artists.add(artist);
            }

            //creating adapter
            ArtistList artistAdapter = new ArtistList(MainActivity.this, artists);
            //attaching adapter to the listview
            listViewArtists.setAdapter(artistAdapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}


/*
 * This method is saving a new artist to the
 * Firebase Realtime Database
 * */
private void addArtist() {
    //getting the values to save
    String name = editTextName.getText().toString().trim();
    String amount = editTextAmount.getText().toString().trim();
    String number = editTextNumber.getText().toString().trim();
    int fb = Integer.parseInt(amount);
    int rl = Integer.parseInt(number);
    int m = fb / rl;

    ArrayList array = new ArrayList();

    for(int l=0; l<rl; l++){
        array.add(l,m);
    }

    Toast.makeText(getBaseContext(), array+"", Toast.LENGTH_SHORT).show();
    //checking if the value is provided
    if (!TextUtils.isEmpty(name)) {

        //getting a unique id using push().getKey() method
        //it will create a unique id and we will use it as the Primary Key for our Artist
        String id = databaseArtists.push().getKey();

        //creating an Artist Object
        Artist artist = new Artist(id, name, amount, number, array);

        //Saving the Artist
        databaseArtists.child(id).setValue(artist);

        //setting edittext to blank again
        editTextName.setText("");
        editTextAmount.setText("");
        editTextNumber.setText("");


        //displaying a success toast
        Toast.makeText(this, "Artist added", Toast.LENGTH_LONG).show();
    } else {
        //if the value is not given displaying a toast
        Toast.makeText(this, "Please enter a name", Toast.LENGTH_LONG).show();
    }
} }

Also, Artist.java equipped with its empty constructor

package com.cosmichawk.classpro;

import com.google.firebase.database.IgnoreExtraProperties;

import java.sql.Array; import java.util.ArrayList;

@IgnoreExtraProperties public class Artist { private String artistId; private String artistName; private String artistAmount; private String artistNumber; private ArrayList artistArray;

public Artist(){
    //this constructor is required
}

public Artist(String artistId, String artistName, String artistAmount, String artistNumber, ArrayList artistArray) {
    this.artistId = artistId;
    this.artistName = artistName;
    this.artistAmount = artistAmount;
    this.artistNumber = artistNumber;
    this.artistArray = artistArray;


}

public String getArtistId() {
    return artistId;
}

public String getArtistName() {
    return artistName;
}

public String getArtistAmount() {
    return artistAmount;
}

public String getArtistNumber() { return artistNumber; }

public ArrayList getArtistArray() { return artistArray; } }

This is what my database looks like:-

enter image description here

3
  • I would really appreciate if you mark my answer as the accepted answer. Thanks Commented Aug 1, 2018 at 22:31
  • Please add your database structure. Commented Aug 2, 2018 at 10:02
  • Added the database structure Commented Aug 2, 2018 at 17:59

1 Answer 1

2

You need to specify the type

artists = new ArrayList<Artist>();

The cleaner way to do this is initialize artists in the declaration space

So instead of

List<Artist> artists;

you can do this

List<Artist> artists = new ArrayList<>();
Sign up to request clarification or add additional context in comments.

1 Comment

This time the array is displayed but the application force closes with the exact same errors

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.