2016-12-09 132 views
0

未能反弹键入为什么我得到这个例外,我在做什么错在这里

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. 

即使我在使用单串的构造函数在我的DataModel类,我得到一个字符串值在一个时间构造器,,为什么出现这种情况,,请别人帮我..

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 class:

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”);'请将该数据发布到该URL(作为文本,没有屏幕截图),您可以从Firebase仪表板导出数据。 –

+0

@FrankvanPuffelen现在请告诉我为什么我得到这个例外。 – user4771594

回答

0

Recycler视图(和列表视图)显示项目列表。 FirebaseRecyclerAdapter用于填充这样的项目列表。

如果您在节点上添加FirebaseRecyclerAdapter,它会尝试将该节点下的节点添加到回收站视图。所以在你的情况下,这意味着它试图将Username,imageurltext添加到列表中。这似乎并不是你想到的。为了解决这个问题,你需要做的适配器听树一个水平:

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

就这样,它会调用populateViewHoldermessages每个孩子,其中前/只有一个是matt__walk

第二个问题是您的JSON中的属性名称的外框与Java类中的相应getter之间有不匹配。

如果使用:

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

是的,它终于工作,,,非常感谢弗兰克你真的救了我的男人,,我被困在三天,现在它终于解决了我的问题,最后一个问题,我如何选择一个特定的节点,如果父节点“消息”有多少个节点。 ,..我应该使用List还是什么? – user4771594