这是logcat:
08-02 00:51:18.627 15840-15840 / com.cosmichawk.classpro E / AndroidRuntime:致命异常: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.internal.firebase_database.zzkt.zzb(未知 资源) 在com.google.android.gms.internal.firebase_database.zzku.zza(未知 资源) 在com.google.android.gms.internal.firebase_database.zzkt.zzb(未知 资源) 位于com.google.android.gms.internal.firebase_database.zzkt.zza(未知 资源) 位于com.google.firebase.database.DataSnapshot.getValue(未知来源) 在com.cosmichawk.classpro.MainActivity $ 6.onDataChange(MainActivity.java:205) 在com.google.android.gms.internal.firebase_database.zzfc.zza(未知 资源) 在com.google.android.gms.internal.firebase_database.zzgx.zzdr(未知 资源) 在com.google.android.gms.internal.firebase_database.zzhd.run(未知 资源) 在android.os.Handler.handleCallback(Handler.java:751) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:154) 在android.app.ActivityThread.main(ActivityThread.java:6186) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
主要活动:
package com.cosmichawk.classpro;
import android.content.Intent;进口 android.support.v7.app.AlertDialog;进口 android.support.v7.app.AppCompatActivity;导入android.os.Bundle; 导入android.text.TextUtils;导入android.view.LayoutInflater; 导入android.view.View;导入android.widget.AdapterView;进口 android.widget.ArrayAdapter;导入android.widget.Button;进口 android.widget.EditText;导入android.widget.ListView;进口 android.widget.Spinner;导入android.widget.Toast;
导入com.google.firebase.database.DataSnapshot;进口 com.google.firebase.database.DatabaseError;进口 com.google.firebase.database.DatabaseReference;进口 com.google.firebase.database.FirebaseDatabase;进口 com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;导入java.util.List;
公共类MainActivity扩展了AppCompatActivity { 公共静态最终字符串ARTIST_NAME =“ com.cosmichawk.classpro.artistname”; 公共静态最终字符串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(); } } }
Artist.java还配备了空的构造函数
package com.cosmichawk.classpro;
导入com.google.firebase.database.IgnoreExtraProperties;
import java.sql.Array;导入java.util.ArrayList;
@IgnoreExtraProperties公共课艺术家{ 私有String artistId; 私有String artistName; 私人String artistAmount; 私有String artistNumber; 私有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; } }
这是我的数据库的样子:-
答案 0 :(得分:1)
您需要指定类型
artists = new ArrayList<Artist>();
更清洁的方法是在声明空间中初始化美工
所以不是
List<Artist> artists;
你可以做到
List<Artist> artists = new ArrayList<>();