2016-04-25 9 views
3

Also, ich habe keine Probleme beim Hinzufügen von Objekten zur Firebase-Datenbank, aber beim Versuch, die hinzugefügten Objekte aus der Datenbank über die Recyclerview mit dem Ui abzurufen Bibliothek ich die folgende Fehlermeldung erhalten:Firebase populating recyclerview error: com.firebase.client.FirebaseException: Fehler beim Springen auf

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: smarthousebillsplitter, PID: 900 
com.firebase.client.FirebaseException: Failed to bounce to type 
    at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:185) 
    at com.firebase.ui.FirebaseRecyclerAdapter.parseSnapshot(FirebaseRecyclerAdapter.java:161) 
    at com.firebase.ui.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:150) 
    at com.firebase.ui.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:190) 
    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5217) 
    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5250) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4487) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363) 
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961) 
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370) 
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333) 
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562) 
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900) 
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071) 
    at android.view.View.layout(View.java:15689) 
    at android.view.ViewGroup.layout(ViewGroup.java:5040) 
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076) 
    at android.view.View.layout(View.java:15689) 
    at android.view.ViewGroup.layout(ViewGroup.java:5040) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
    at android.view.View.layout(View.java:15689) 
    at android.view.ViewGroup.layout(ViewGroup.java:5040) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 
    at android.view.View.layout(View.java:15689) 
    at android.view.ViewGroup.layout(ViewGroup.java:5040) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
    at android.view.View.layout(View.java:15689) 
    at android.view.ViewGroup.layout(ViewGroup.java:5040) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 
    at android.view.View.layout(View.java:15689) 
    at android.view.ViewGroup.layout(ViewGroup.java:5040) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
    at android.view.View.layout(View.java:15689) 
    at android.view.ViewGroup.layout(ViewGroup.java:5040) 
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2116) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1873) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1084) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5990) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
    at android.view.Choreographer.doFrame(Choreographer.java:550) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
    at android.os.Handler.handleCallback(Handler.java:746) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5343) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 
Caused by: com.fasterxml.jackson.databind.JsonMappin 

ist die recyclerview:

public class ExpenseFragment extends Fragment { 
    private RecyclerView ExpenseRecyclerView; 
    Firebase ExpenseRef = new Firebase(Constants.Firebase_URL).child("Expense"); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
     Firebase.setAndroidContext(getActivity()); 
    } 

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

     View view = inflater.inflate(R.layout.fragment_expense , container, false); 
     ExpenseRecyclerView = (RecyclerView) view.findViewById(R.id.Expense_Recycler_View); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
     ExpenseRecyclerView.setLayoutManager(layoutManager); 

      FirebaseRecyclerAdapter<Expense,ExpenseHolder> mRecyclerAdapter = new FirebaseRecyclerAdapter<Expense, ExpenseHolder>(Expense.class , 
       R.layout.custom_expense_row_layout,ExpenseHolder.class, ExpenseRef) { 
      @Override 
      protected void populateViewHolder(ExpenseHolder expenseHolder, Expense expense, int i) { 
       expenseHolder.nameTextView.setText(expense.getName()); 
       expenseHolder.amountTextView.setText(expense.getAmount()); 
       expenseHolder.createdByTextView.setText(expense.getCreatedBy()); 
       expenseHolder.shoppingImageView.setImageResource(R.drawable.shopping); 
      } 
     }; 

     ExpenseRecyclerView.setAdapter(mRecyclerAdapter); 
     return view; 
    } 

    public static class ExpenseHolder extends RecyclerView.ViewHolder { 
     private TextView nameTextView; 
     private TextView amountTextView; 
     private TextView createdByTextView; 
     private ImageView shoppingImageView; 

     public ExpenseHolder(View itemView) { 
      super(itemView); 

      nameTextView = (TextView) itemView.findViewById(R.id.name); 
      amountTextView = (TextView) itemView.findViewById(R.id.amount); 
      createdByTextView = (TextView) itemView.findViewById(R.id.CreatedBy); 
      shoppingImageView = (ImageView) itemView.findViewById(R.id.ExpenseImage); 

     } 
    } 
} 

Hier ist die Java-Modellklasse:

public class Expense { 

    private String amount; 
    private String createdBy; 

    private String name; 


    public Expense() { 
    } 

    public Expense(String amount, String createdBy, String name) { 

     this.amount = amount; 
     this.createdBy = createdBy; 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getAmount() { 
     return amount; 
    } 

    public String getCreatedBy() { 
     return createdBy; 
    } 
} 

und hier ist das Objekt in der Datenbank im abzurufen versuchen:

Image

Debug-Trace

+0

Sie haben den interessantesten Teil der Ausnahme übersprungen, der nach 'verursacht durch: com.fasterxml.jackson.databind.JsonMapping' auftritt. Aber meine erste Schätzung ist, dass 'Expense' in einer anderen Java-Klasse definiert ist, in diesem Fall müssen Sie es statisch markieren:' public static class Expense' –

+0

@FrankvanPuffelen Ich wünschte, ich hätte es übersprungen :-) aber in Wirklichkeit ist das der Fall Es stoppt tatsächlich http://imgur.com/q373Q2l. Ich denke, das liegt an diesem Fehler, wenn ich die App nach ein paar Sekunden erzwinge, schließt er. Auch Expense ist eine eigene Klasse in meinem Model-Paket. – Nbacareerthrowaway

+0

Ohne den vollständigen Stack-Trace zu sehen, ist das Beste, was ich Ihnen sagen kann, diese zu suchen: http://stackoverflow.com/questions/32108969/why-do-i-get-failed-to-bounce-to-type- when-i-turn-json-von-firebase-in-java –

Antwort

2

Sie eine ListAdapter verwenden einen einzigen Expense zu zeigen. Das bedeutet, dass jedes Kind des Verweises eine einzige Eigenschaft amount, createdBy oder name ist.

D/EventRaiser: Raising /Expense: CHILD_ADDED: { createdBy: anon }

D/EventRaiser: Raising /Expense: CHILD_ADDED: { name: BT bill }

Die FirebaseRecyclerAdapter wird mit einer Liste von Objekten zu arbeiten, das heißt eine Liste von Expense Objekten. Sobald Sie eine Liste der Ausgaben erstellen, wird es besser funktionieren.

+0

Fall geschlossen :-) Problem gelöst. Danke, dass Sie mir geholfen haben, mein Problem zu lösen. Sehr geschätzt. – Nbacareerthrowaway

+0

Gut zu hören. Wenn meine Antwort nützlich war, klicken Sie auf den Upvote-Button links davon. Wenn es Ihre Frage beantwortet hat, klicken Sie auf das Häkchen, um es zu akzeptieren. Auf diese Weise wissen andere, dass Ihnen (ausreichend) geholfen wurde. –

+0

Ich habe Ihre Antwort markiert, aber es lässt mich nicht Ihre Wahl abstimmen, da ich noch keinen Ruf von 15 habe :-(Wieder möchte ich Ihnen für Ihre Zeit danken, dass Sie mir geholfen haben und einen guten Tag haben. – Nbacareerthrowaway