2017-04-20 9 views
2

私はFirebaseを初めて使いました。リストビューに子の情報を表示する必要があります。それはデータを追加しますが、それはリストビューに表示されず、アプリケーションがクラッシュします。エラーがログに表示されていないが、firebaseクラッシュに私はこのエラーがあります:リストビューのFirebaseリストの子

Exception com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String 
com.google.android.gms.internal.zzamy.zzcg() 
com.google.android.gms.internal.zzamy.zzb() 
com.google.android.gms.internal.zzamy.zza() 
com.google.firebase.database.DataSnapshot.getValue() 
br.com.imobapp.CorretorFragment$1.onChildAdded (CorretorFragment.java:58) 
com.google.android.gms.internal.zzaip.zza() 
com.google.android.gms.internal.zzakp.zzcxi() 
com.google.android.gms.internal.zzaks$1.run() 
android.os.Handler.handleCallback (Handler.java:739) 
android.os.Handler.dispatchMessage (Handler.java:95) 
android.os.Looper.loop (Looper.java:145) 
android.app.ActivityThread.main (ActivityThread.java:5832) 

私のデータは、(私のアカウントは、リンクだけ新しいものであるため、申し訳ありませんが、写真を投稿することはできません)このようなものです:

https://i.stack.imgur.com/lZHFC.jpg

私のモデルは次のとおりです。

import com.google.firebase.database.IgnoreExtraProperties; 

@IgnoreExtraProperties 
public class ModelCorretor { 
    private String CorNome; 
    private String CorCreci; 


    public ModelCorretor(){ 

    }; 

    public ModelCorretor(String CorNome, String CorCreci){ 

     this.CorNome = CorNome; 
     this.CorCreci = CorCreci; 

    }; 

    public String getCorNome() { 
     return CorNome; 
    } 

    public void setCorNome(String corNome) { 
     CorNome = corNome; 
    } 

    public String getCorCreci() { 
     return CorCreci; 
    } 

    public void setCorCreci(String corCreci) { 
     CorCreci = corCreci; 
    } 
} 

そして、リストビュー上でそれを示すために私の断片:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageButton; 
import android.widget.ListView; 

import com.google.firebase.database.ChildEventListener; 
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 java.util.ArrayList; 

import static android.content.ContentValues.TAG; 


public class CorretorFragment extends Fragment implements View.OnClickListener { 

    public CorretorFragment() { 
     // Required empty public constructor 
    } 

    ImageButton btAddCor, btSearchCor; 
    ListView lvCorretor; 
    DatabaseReference dref; 
    ArrayList<String> list = new ArrayList<>(); 
    ArrayAdapter<String> adapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 


     View view = inflater.inflate(R.layout.fragment_corretor, container, false); 
     btAddCor =(ImageButton)view.findViewById(R.id.btAddCor); 
     btAddCor.setOnClickListener(this); 
     btSearchCor =(ImageButton)view.findViewById(R.id.btSearchCor); 
     btSearchCor.setOnClickListener(this); 
     lvCorretor = (ListView)view.findViewById(R.id.lvCorretor); 
     adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_dropdown_item_1line, list); 
     lvCorretor.setAdapter(adapter); 

     dref = FirebaseDatabase.getInstance().getReference().child("Corretores"); 
     dref.addChildEventListener(new ChildEventListener() { 
      @Override 
      // Read from the database 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       String value = dataSnapshot.getValue(String.class); 
       list.add(value); 
       adapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       // This method is called once with the initial value and again 
       // whenever data at this location is updated. 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 
       String value = dataSnapshot.getValue(String.class); 
       list.remove(value); 
       adapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError error) { 
       // Failed to read value 
       Log.w(TAG, "Failed to read value.", error.toException()); 
      } 
     }); 




     return view; 
    } 


     @Override 
     public void onClick(View view){ 
     MainActivity activity = (MainActivity)getActivity(); 
      switch(view.getId()){ 

       case R.id.btAddCor: 
        activity.chamaAddCor(); 
        break; 
       case R.id.btSearchCor: 
        activity.chamaSearchCor(); 
        break; 
       default: throw new RuntimeException("unreachable"); 

      } 
     } 
} 

さらにコードが必要な場合や、質問に間違ったことがあった場合は、お知らせください。 私はFirebaseDatabase.getInstance().getReference().child("Corretores");で行ったように、私はそれを示すために子供を設定しなければならないと考えていますが、私はたくさん試して、onChildAddedでそれを行う方法を知りません。

答えて

1

問題はここにある:

String value = dataSnapshot.getValue(String.class); 

あなたは、あなたがしたいオブジェクトのためのモデルを取得する必要があり、Stringオブジェクトを取得するべきではありません。あなたのCorretorのためのモデルを持っているので、あなたが実行します。

ModelCorretor value = dataSnapshot.getValue(ModelCorretor.class); 

getValueは、HashMapを返し、あなたがそのエラーを取得している理由は、文字列、それを割り当てています。 Firebaseは、getValueメソッドのパラメータとしてModelCorretorを挿入するだけで、そのオブジェクトを構築するという点で優れています。

+0

ありがとうございます。しかし今、別のエラーが出ます。 list.add(value)では、配列リストのadd(java.lang.String)はbr.com.imobapp.ModelCorretorに適用できません。どのようにオブジェクトに変更するのですか? –

+0

私はそれを修正しました、私はArrayList list = new ArrayList <>()宣言するのを忘れていました。 ArrayAdapter アダプタ。 –

関連する問題