2016-12-09 15 views
0

をやっていることは、私は私のDataModelクラスで単一の文字列コンストラクタを使用している場合でも、私は一度に1つの文字列値を取得私はこの例外を取得していますなぜ、私はここで間違っ

W/System.err: 
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183) 

caused by : com.fasterxml.jackson.databind.JsonMappingException: 
Can not instantiate value of type [simple type, class hi.example.com.hi.DataModel] from String value; no single-String constructor/factory method. 

を入力するバウンスに失敗しました。コンストラクタ,,この出来事は,,誰かが私を助けてください、なぜ..

here is my json file 
    { 
     "messages": { 
     "matt__walk": { 
      "Username": "matt__walk", 
      "imageurl": "https://firebasestorage.googleapis.com/v0", 
      "text": "hii" 
      } 
     } 
    } 

のDataModelクラス:

@JsonIgnoreProperties(ignoreUnknown=true) 
public class DataModel { 
    private String Username; 
    private String imageurl; 
    private String text; 

    public DataModel(){ 
    } 
    public String getUsername() { 
     return Username; 
    } 
    public String getText() { 
     return text; 
    } 
    public String getImageUrl() { 
     return imageurl; 
    } 
} 

馬inActivityクラス:

public class MainActivity extends AppCompatActivity { 
    private static final String TAG = "MainActivity"; 
    Menu menu; 
    private Toolbar toolbar; 
    private LinearLayoutManager layoutManager; 
    private static RecyclerView recyclerView; 
    private Firebase ref; 
    private String res; 
    private DatabaseReference mDatabase; 
    private FirebaseRecyclerAdapter<DataModel, MessageViewHolder> mFirebaseAdapter; 

    public static class MessageViewHolder extends RecyclerView.ViewHolder { 
     View mViews; 
     CircleImageView img; 
     TextView name,data; 
     public MessageViewHolder(View views) { 
      super(views); 
      mViews = views; 
     } 

     public void setText(String Name) { 
      TextView name = (TextView) mViews.findViewById(R.id.Name); 
      name.setText(Name); 
     } 

     public void setData(String Data) { 
      TextView data = (TextView) mViews.findViewById(R.id.datas); 
      data.setText(Data); 
     } 

     public void setImage(Context cnt, String imageUrl) { 
      CircleImageView img = (CircleImageView) mViews.findViewById(R.id.image); 
      Picasso.with(cnt).load(imageUrl).into(img); 
     } 

    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainactivity); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     Firebase.setAndroidContext(this); 
     recyclerView = (RecyclerView) findViewById(R.id.recycler); 
     recyclerView.setHasFixedSize(true); 
     layoutManager = new LinearLayoutManager(this); 
     ref = new Firebase("https://hi-34.firebaseio.com/messages/matt__walk"); 
     mFirebaseAdapter = new FirebaseRecyclerAdapter<DataModel, MessageViewHolder>(
       DataModel.class, 
       R.layout.rowplaces, 
       MessageViewHolder.class, 
       ref 
     ) { 
      @Override 
      protected void populateViewHolder(MessageViewHolder messageViewHolder, DataModel dataModel, int i) { 


         messageViewHolder.setText(dataModel.getUsername()); 
         messageViewHolder.setData(dataModel.getText()); 
       messageViewHolder.setImage(getApplicationContext(),dataModel.getImageUrl()); 


      } 
     }; 
     mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
      @Override 
      public void onItemRangeInserted(int positionStart, int itemCount) { 
       super.onItemRangeInserted(positionStart, itemCount); 
       int friendlyMessageCount = mFirebaseAdapter.getItemCount(); 
    int lastVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition(); 
       if (lastVisiblePosition == -1 || 
         (positionStart >= (friendlyMessageCount - 1) && 
           lastVisiblePosition == (positionStart - 1))) { 
        recyclerView.scrollToPosition(positionStart); 
       } 
      } 
     }); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(mFirebaseAdapter); 
    } 
+1

私はあなたが人々が何を見ることができるように、そのどこかにそれを置くあなたのコードを示すことなく、任意の助けを得ることはありませんかなり確信していますやっている/しようとしている。 –

+0

'ref = new Firebase(" URL here ");' Firebaseダッシュボードからエクスポートできる、そのURLにテキストとして(スクリーンショットなし)データを投稿してください。 –

+0

@FrankvanPuffelen今、なぜその例外が出ているのか教えてください。 – user4771594

答えて

0

リサイクルビュー(およびリストビュー)は、アイテムのリストを表示します。 FirebaseRecyclerAdapterは、そのような項目のリストを設定します。

ノードにFirebaseRecyclerAdapterを追加すると、というノードの下にあるノードをリサイクラビューに追加しようとします。あなたのケースでは、それはUsernameimageurltextをリストに追加しようとしていることを意味します。それはあなたが念頭に置いているようではありません。この問題を解決するには、アダプタは、ツリーの1つの上のレベルが高い聞くようにする必要があります:それはmessagesのそれぞれの子のためにpopulateViewHolderを呼び出しますが、それと

ref = new Firebase("https://hi-34.firebaseio.com/messages"); 
mFirebaseAdapter = new FirebaseRecyclerAdapter<DataModel, MessageViewHolder>(
     DataModel.class, 
     R.layout.rowplaces, 
     MessageViewHolder.class, 
     ref 
) { 

、最初の/つのみがmatt__walkです。

第2の問題は、JSON内のプロパティ名のケーシングと、Javaクラス内の対応するゲッターとの間に不一致があることです。

使用する場合:

public class DataModel { 
    private String username; 
    private String imageUrl; 
    private String text; 

    public DataModel(){ 
    } 
    public String getUsername() { 
     return Username; 
    } 
    public String getText() { 
     return text; 
    } 
    public String getImageUrl() { 
     return imageurl; 
    } 
} 

そして:

matt__walk": { 
    "username": "matt__walk", 
    "imageUrl": "https://firebasestorage.googleapis.com/v0", 
    "text": "hii" 
} 
+0

ええ、その最終的に働く、フランクに大きな感謝あなたは本当に私の一日の人を節約、私は3日間から立ち往生した、今それは最終的に私の問題を解決した、最後の質問、 "メッセージ"にはノード数があります。 、..リストを使ってそれをどうやって使うべきでしょうか? – user4771594

関連する問題