1

この質問は数回答えられましたが、回答のいずれかが私の問題を解決できませんでした。Firebase DBからリサイクラーのviiewを取り込めません

ファイアベースDBには2つのキーと値のペアしかありません。以下はjsonです。

{ 
    "route" : { 
    "routeA" : { 
    "stop" : "Street 1", 
    "time" : "11:00 PM" 
    } 
} 
} 

はfirebase DB

recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    rootRef = new Firebase("https://listrecycler.firebaseio.com/route/"); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    itemsRef = rootRef.child("route B"); 
    Toast.makeText(MainActivity.this, "crossed itemRef", Toast.LENGTH_SHORT).show(); 
    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Route, RouteViewHolder>(Route.class, android.R.layout.two_line_list_item, RouteViewHolder.class, itemsRef) { 
     @Override 
     public void populateViewHolder(RouteViewHolder routeViewHolder, Route route, int i) { 
      Toast.makeText(MainActivity.this, "reached populate view holder", Toast.LENGTH_SHORT).show(); 
      Log.d(TAG, "populateViewHolder: " + route); 
      routeViewHolder.place.setText(route.getStop()); 
      routeViewHolder.time.setText(route.getTime()); 
     } 
    }; 
    recyclerView.setAdapter(firebaseRecyclerAdapter); 

} 

public static class RouteViewHolder extends RecyclerView.ViewHolder { 

    TextView place; 
    TextView time; 

    public RouteViewHolder(View itemView) { 
     super(itemView); 
     place = (TextView) itemView.findViewById(android.R.id.text1); 
     time = (TextView) itemView.findViewById(android.R.id.text2); 
    } 
} 

フランクにより示唆されるようにこれは、任意のrecyclerviewない単純なコードであるからデータを取得するための私のコードです。コードは正常に動作しています。ジャクソン・エラーません

rootRef = new Firebase("https://listrecycler.firebaseio.com/route"); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 
    itemsRef = rootRef.child("routeA"); 

    itemsRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Route routeDetails = dataSnapshot.getValue(Route.class); 
      String stop = routeDetails.getStop(); 
      String time = routeDetails.getTime(); 
      Toast.makeText(MainActivity.this, "Stop Name:"+ stop+"Time:"+time, Toast.LENGTH_SHORT).show(); 
      Log.d(TAG, "onDataChange: "+dataSnapshot); 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 

んが、この次は、私のPOJO

public class Route { 
public String stop; 
public String time; 

public Route() { 
} 

public Route(String stop, String time) { 
    this.stop = stop; 
    this.time = time; 
} 

public String getStop() { 
    return stop; 
} 

public void setStop(String stop) { 
    this.stop = stop; 
} 

public String getTime() { 
    return time; 
} 

public void setTime(String time) { 
    this.time = time; 
} 
} 

あるコードの問題は、ジャクソンは、私はPOJOを使用していたときにFirebaseによって送信されたデータをデシリアライズすることができないということです。 Route POJOの代わりに単純なStringクラスを使用すると、データはリサイクラビューアイテムに完全に書き込まれます。以下は、私はPOJOとFirebase DBマッチ複数回のString名いることを確認するためにチェックFirebaseからデータをフラッシュしているエラーログ

05-06 22:38:03.724 30051-30051/abc.com.example.vijsu.listrecyclerfirebase E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: abc.com.example.vijsu.listrecyclerfirebase, PID: 30051 
                         com.firebase.client.FirebaseException: Failed to bounce to type 
                          at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183) 
                          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:5465) 
                          at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5498) 
                          at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4735) 
                          at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4611) 
                          at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1988) 
                          at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1384) 
                          at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1347) 
                          at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
                          at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3026) 
                          at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2903) 
                          at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1457) 
                          at android.support.v7.widget.RecyclerView.access$400(RecyclerView.java:147) 
                          at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:285) 
                          at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                          at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                          at android.view.Choreographer.doFrame(Choreographer.java:603) 
                          at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                          at android.os.Handler.handleCallback(Handler.java:739) 
                          at android.os.Handler.dispatchMessage(Handler.java:95) 
                          at android.os.Looper.loop(Looper.java:148) 
                          at android.app.ActivityThread.main(ActivityThread.java:5417) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                         Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class abc.com.example.vijsu.listrecyclerfirebase.Route] from String value; no single-String constructor/factory method 
                          at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:428) 
                          at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:299) 
                          at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1056) 
                          at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:136) 
                          at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:123) 
                          at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888) 
                          at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034) 
                          at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:181) 
                          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:5465)  
                          at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5498)  
                          at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4735)  
                          at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4611)  
                          at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1988)  
                          at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1384)  
                          at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1347)  
                          at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)  
                          at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3026)  
                          at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2903)  
                          at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1457)  
                          at android.support.v7.widget.RecyclerView.access$400(RecyclerView.java:147)  
                          at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:285)  
                          at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)  
                          at android.view.Choreographer.doCallbacks(Choreographer.java:670)  
                          at android.view.Choreographer.doFrame(Choreographer.java:603)  
                          at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)  
                          at android.os.Handler.handleCallback(Handler.java:739)  
                          at android.os.Handler.dispatchMessage(Handler.java:95)  
                          at android.os.Looper.loop(Looper.java:148)  
                          at android.app.ActivityThread.main(ActivityThread.java:5417)  
                          at java.lang.reflect.Method.invoke(Native Method)  
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

です。私はPOJOに関連する何かを見逃していますが、それを理解することはできません。

しかし、エラーはまだリサイクルビューで存在します!

+0

最近、この例外のいくつかのケースがありました。例えば。 http://stackoverflow.com/questions/36231398/これが原因でない場合は、JSONの画像を実際のJSONに置き換えることができますか?Firebaseダッシュボードの[エクスポート]ボタンをクリックすると簡単に取得できます。さらに、「RecyclerView」を必要としないコードで問題を特定できますか?私はあなたが単一の 'ref.getValue(Route.class) 'でそれを再現できることを確信しています。それはあなたを助けやすくします。 –

+0

@FrankvanPuffelenリサイクラービューのないシンプルなコードはとてもうまく動作します。しかし私は自分のコードでリサイクルビューが必要です。ありがとう。 – Vijay

答えて

0

私はリサイクラービューがプロパティのリストを取り、1つの行に複数のプロパティ(停止と時間)を表示することを忘れていました。だから私はちょうどルートAを取得し、表示するためにfirebasuiに与える必要があります。私はrouteAまでデータを取得している間に深いレベルに入り、firebaseuiはプロパティを認識できませんでした。 ルートまでの1つのレベルクエリだけで、ストップ時間プロパティを1行で表示するには十分です。

少しずつ重要なことを知らない私のような人に役立つように、別の回答として書きました。このコンセプトは@Frank van Puffelenが同様のものに投稿した回答の一部です。

4

エラーがこの

に言及している型の値をインスタンス化することはできません...ルートは...ない、単一のStringのコンストラクタ/ファクトリメソッド

ですから、1

を追加したい場合があります
public class Route { 

    public String stop; 
    public String time; 

    public Route() {} 

    public Route(String routeJSON) { 
     // TODO: Parse out JSON object 
     // call setters... 
    } 

    public Route(String stop, String time) { 
     this.stop = stop; 
     this.time = time; 
    } 
+0

cricket_007パラメータ化されたコンストラクタから2番目のパラメータを削除しましたが、すべてが正常に動作して1つの文字列コンストラクタになりました。しかし問題は、ファイアベースDBにデータをプッシュするために、パラメータ化されたコンストラクタが必要なことです。パブリックルート(ストリングストップ){ this.stop = stop; } – Vijay

+0

私が見つけたもう一つのことは、単一の文字列構造体に存在するプロパティのうち、その値だけがJSONから抽出されていることです。もう一方の値はnullを返します。 – Vijay

+0

これは、**両方の文字列を設定する必要があるからです...両方の値を含むJSON文字列を取得しています。それは私が 'routeJSON'と' call setters 'の意味です。その文字列をJSONObjectに変換するには、Jacksonを使用する必要があります –

関連する問題