代码之家  ›  专栏  ›  技术社区  ›  Tiago Vicente

无法转换java类型的对象。字符串输入tiagov。rideabike1.Model。弗雷特斯

  •  0
  • Tiago Vicente  · 技术社区  · 7 年前

    我正在使用FirebaseUi填充一个RecyclerView,但当我启动应用程序时,什么都没有显示。我看到了很多教程和视频,但都没有效果,也许这是一个愚蠢的问题,但我是android新手,以下是我正在使用的所有代码:

    这是模型课

    public class Fretes {
    
        private String mColeta;
        private String mEntrega;
        private String mStatus;
    
    
    public Fretes() {
    
        }
        public Fretes(String mColetaLat, String mColetaLong, String mEntregaLat, String mEntregaLong, String mStatus) {
            this.mColeta= mColetaLat;
            this.mEntrega = mEntregaLat;
            this.mStatus = mStatus;
        }
    
        public String getmColeta() {
            return mColeta;
        }
    
        public void setmColeta(String mColetaLat) {
            this.mColeta = mColeta;
        }
    
        public String getmEntrega() {
            return mEntrega;
        }
    
        public void setmEntrega(String mEntrega) {
            this.mEntrega = mEntrega;
        }
    
    
        public String getmStatus() {
            return mStatus;
        }
    
        public void setmStatus(String mStatus) {
            this.mStatus = mStatus;
        }
    }
    

    这是holder类

    public class FretesHolder extends RecyclerView.ViewHolder {
    
        private final TextView text_coleta;
        private final TextView text_entrega;
        private final TextView text_status;
    
        public FretesHolder(View itemView) {
            super(itemView);
    
            text_coleta = (TextView) itemView.findViewById(R.id.text_coleta);
            text_entrega = (TextView) itemView.findViewById(R.id.text_entrega);
            text_status = (TextView) itemView.findViewById(R.id.text_status);
    
        }
    
        public void setText_coleta(String coleta){
            setText_coleta(coleta);
        }
    
        public void setText_entrega(String entrega){ setText_entrega(entrega); }
    
        public void setText_status(String status){ setText_status(status); }
    public class FretesHolder extends RecyclerView.ViewHolder {
    
        private final TextView text_coleta;
        private final TextView text_entrega;
        private final TextView text_status;
    
        public FretesHolder(View itemView) {
            super(itemView);
    
            text_coleta = (TextView) itemView.findViewById(R.id.text_coleta);
            text_entrega = (TextView) itemView.findViewById(R.id.text_entrega);
            text_status = (TextView) itemView.findViewById(R.id.text_status);
    
        }
    
        public void setText_coleta(String coleta){
            setText_coleta(coleta);
        }
    
        public void setText_entrega(String entrega){ setText_entrega(entrega); }
    
        public void setText_status(String status){ setText_status(status); }
    }
    

    这里是主课堂

    public class RecyclerViewTest extends AppCompatActivity {
    
        private FirebaseRecyclerAdapter<Fretes, FretesHolder> adapter;
        private RecyclerView mRecyclerFretes;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_reclycler_view);
    
    
            mRecyclerFretes = (RecyclerView) findViewById(R.id.recyclerTest);
            mRecyclerFretes.setHasFixedSize(true);
    
            setupAdapter();
        }
    
        private void setupAdapter() {
    
            Query query = FirebaseDatabase.getInstance()
                    .getReference()
                    .child("test");
    
            FirebaseRecyclerOptions<Fretes> options =
                    new FirebaseRecyclerOptions.Builder<Fretes>()
                            .setQuery(query, Fretes.class)
                            .build();
    
            adapter = new FirebaseRecyclerAdapter<Fretes, FretesHolder>(options) {
                @Override
                public FretesHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                    View view = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.layout_fretes, parent, false);
    
                    return new FretesHolder(view);
                }
    
                @Override
                protected void onBindViewHolder(FretesHolder holder, int position, Fretes model) {
                    holder.setText_status(model.getmStatus());
                    holder.setText_entrega(model.getmEntrega());
                    holder.setText_coleta(model.getmColeta());
                }
    
            };
            mRecyclerFretes.setAdapter(adapter);
        }
    
        @Override
        public void onStart() {
            super.onStart();
            adapter.startListening();
        }
    
        @Override
        public void onStop(){
            super.onStop();
            adapter.stopListening();
    
        }
    }
    

    我看不出我错过了什么,也看不出哪里错了,如果能得到一些帮助,我将不胜感激。谢谢

    编辑 我添加了onCreate上缺少的这一行

     mRecyclerFretes.setLayoutManager(new LinearLayoutManager(this));
    

    现在我发现了这个错误:(

    com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type tiagov.rideabike1.Model.Fretes
     at com.google.android.gms.internal.zzear.zzb(Unknown Source:842)
     at com.google.android.gms.internal.zzear.zza(Unknown Source:0)
     at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
     at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:23)
     at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:14)
     at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:32)
     at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:45)
     at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:103)
     at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:118)
     at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482)
     at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515)
     at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458)
     at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724)
     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
     at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
     at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
     at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
     at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
     at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
     at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
     at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1710)
     at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:346)
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
     at android.view.Choreographer.doCallbacks(Choreographer.java:778)
     at android.view.Choreographer.doFrame(Choreographer.java:710)
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
     at android.os.Handler.handleCallback(Handler.java:789)
     at android.os.Handler.dispatchMessage(Handler.java:98)
     at android.os.Looper.loop(Looper.java:164)
     at android.app.ActivityThread.main(ActivityThread.java:6567)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
    

    我的数据库 firebase

    1 回复  |  直到 7 年前
        1
  •  0
  •   Frank van Puffelen    7 年前

    当您将FirebaseUI适配器连接到位置/查询时,每个 子节点 并尝试将该子节点的属性映射到类中的属性。

    位置下的子节点是 mColeta , mEntrega mStatus . 对于其中的每一个,Firebase都创建了一个 Fretes 对象,然后尝试映射属性。每个子节点只有一个名为 true ,因此映射失败。

    一种方法是为子节点的JSON添加一个级别:

    test
      -Lsdfiuhsaiu
        mColeta: "teste"
        mEntrega: "teste"
        mStatus: "teste"
    

    使用这种结构,有一个额外级别的节点,您的适配器可以找到属性。