here's the logcat:
这是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)
08-02 00:51:18.627 15840-15840 / com.cosmichawk.classpro E / AndroidRuntime:FATAL EXCEPTION:main进程:com.cosmichawk.classpro,PID:15840 com.google.firebase.database.DatabaseException:类java.util .ArrayList具有泛型类型参数,请使用GenericTypeIndicator代替com.google.android.gms.internal.firebase_database.zzkt.zzb(未知来源)com.google.android.gms.internal.firebase_database.zzkt.zza(未知来源)来自com.google.android.gms的com.google.android.gms.internal.firebase_database.zzkt.zzb(未知来源)com.google.android.gms.internal.firebase_database.zzku.zza(未知来源)。 com.google.android.gms.internal.firebase_database.zzkt.zza(未知来源)中的internal.firebase_database.zzkt.zzb(未知来源)位于com的com.google.firebase.database.DataSnapshot.getValue(未知来源)。 cosmichawk.classpro.MainActivity $ 6.onDataChange(MainActivity.java:205)com.google.android.gms.internal.firebase_database.zzfc.zza(未知来源)com.google.android.g ms.internal.firebase_database.zzgx.zzdr(未知来源)位于android.os.Handler.handleCallback(Handler.java:751)的com.google.android.gms.internal.firebase_database.zzhd.run(未知来源)位于android.app.Looper.loop(Looper.java:154)的.os.Handler.dispatchMessage(Handler.java:95)位于java.lang.reflect的android.app.ActivityThread.main(ActivityThread.java:6186)。在Com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889)上的Method.invoke(Native Method)
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 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 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;
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";
公共类MainActivity扩展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
此外,Artist.java配备了空构造函数
package com.cosmichawk.classpro;
import com.google.firebase.database.IgnoreExtraProperties;
import java.sql.Array; import java.util.ArrayList;
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;
@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:-
这是我的数据库的样子: -
在此处输入图像描述
1 个解决方案
#1
1
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<>();
#1
1
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<>();