前提・実現したいこと
firebaseのRealtime Databaseを用いて掲示板のような機能を持つandroidアプリを作っています。下図で示したようなfirebase上のdatabaseからpeople部分をアプリ上にテキストとして表示したいのですがよくわからないエラーが起きてしまいました。解決方法を教えてくださいませんか?よろしくお願いします。
発生している問題・エラーメッセージ
com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.util.HashMap
該当のソースコード
java
1package com.example.cyberuniversity; 2 3import android.content.Intent; 4import android.os.Bundle; 5import android.view.View; 6import android.widget.EditText; 7import android.widget.TextView; 8import android.widget.Toast; 9 10import androidx.annotation.NonNull; 11import androidx.appcompat.app.AppCompatActivity; 12 13import com.google.firebase.auth.FirebaseAuth; 14import com.google.firebase.auth.FirebaseUser; 15import com.google.firebase.database.DataSnapshot; 16import com.google.firebase.database.DatabaseError; 17import com.google.firebase.database.DatabaseReference; 18import com.google.firebase.database.FirebaseDatabase; 19import com.google.firebase.database.GenericTypeIndicator; 20import com.google.firebase.database.ValueEventListener; 21 22import java.util.List; 23 24public class DatabaseActivity extends AppCompatActivity { 25 private TextView textView1; 26 private FirebaseAuth mAuth; 27 private FirebaseDatabase database; 28 private EditText mesText; 29 private EditText dataText; 30 @Override 31 public void onCreate (Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_database); 34 mAuth = FirebaseAuth.getInstance(); 35 database = FirebaseDatabase.getInstance(); 36 FirebaseUser currentUser = mAuth.getCurrentUser(); 37 updateUI(currentUser); 38 //↑activity開いてすぐやる 39 // ↓xmlから取得 40 mesText = findViewById(R.id.messageText); 41 dataText = findViewById(R.id.recieveData); 42 43 DatabaseReference people = database.getReference("people"); 44 45 people.addValueEventListener(new ValueEventListener() { 46 @Override 47 public void onDataChange(DataSnapshot snapshot) { 48 GenericTypeIndicator<List<Person>> gt_indicator = 49 new GenericTypeIndicator<List<Person>>() {}; 50 List<Person> values = snapshot.getValue(gt_indicator); 51 String res = ""; 52 for (Object p: values){ 53 res += p + "\n"; 54 } 55 dataText.setText(res); 56 } 57 58 @Override 59 public void onCancelled(@NonNull DatabaseError error) { 60 61 } 62 }); 63 } 64 65 public void doLogout(View view) { 66 mAuth.signOut(); 67 Toast.makeText(DatabaseActivity.this, "Logouted...", Toast.LENGTH_LONG).show(); 68 Intent intent = new Intent(DatabaseActivity.this, MainActivity.class); 69 startActivity(intent); 70 } 71 72 public void updateUI (FirebaseUser user) { 73 textView1 = findViewById(R.id.textView); 74 if (user == null) { 75 textView1.setText("no login..."); 76 } else { 77 textView1.setText("login: " + user.getEmail()); 78 } 79 } 80 81 public void doAction(View view) { 82 DatabaseReference myRef = database.getReference("message"); 83 String s = mesText.getText() + ""; 84 myRef.setValue(s); 85 Toast.makeText(DatabaseActivity.this, "write data!", 86 Toast.LENGTH_SHORT).show(); 87 } 88 89 class Person { 90 public int age; 91 public String mail; 92 public String name; 93 public String university; 94 95 96 97 public Person(){}; 98 99 100 public Person(int age, String mail, String name, String university){ 101 this.age = age; 102 this.mail = mail; 103 this.name = name; 104 this.university = university; 105 } 106 107 108 public String toString(){ 109 return this.name + " [" + this.mail + "," + this.age + "," + this.university + "]"; 110 } 111 } 112 113} 114
試したこと
補足情報(FW/ツールのバージョンなど)
android studio 4.1.1を用いています。
サーバーレス開発プラットフォームFIREBASE入門という書籍を参考にしています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/28 15:21