无法将 java.lang.String 类型的对象转换为 com.example 类型

Posted

技术标签:

【中文标题】无法将 java.lang.String 类型的对象转换为 com.example 类型【英文标题】:Can't convert object of type java.lang.String to type com.example 【发布时间】:2018-07-08 17:11:26 【问题描述】:

我不可能解决这个刚刚出现的问题..之前一切正常....这是错误:

com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.nicco.wallpapersapp.GridItem 类型 在 com.google.android.gms.internal.zzbtg.zze(未知来源) 在 com.google.android.gms.internal.zzbtg.zzb(未知来源) 在 com.google.android.gms.internal.zzbtg.zza(未知来源) 在 com.google.firebase.database.DataSnapshot.getValue(未知来源) 在 com.firebase.ui.database.FirebaseRecyclerAdapter.parseSnapshot(FirebaseRecyclerAdapter.java:151) 在 com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:140) 在 com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:183) 在 android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482) 在 android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515) 在 android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458) 在 android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559) 在 android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229) 在 android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556) 在 android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516) 在 android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608) 在 android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693) 在 android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410) 在 android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1710) 在 android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:346) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:874) 在 android.view.Choreographer.doCallbacks(Choreographer.java:686) 在 android.view.Choreographer.doFrame(Choreographer.java:618) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 应用程序终止。

我的班级:

public class HomePage extends AppCompatActivity 

private DrawerLayout mDraw;
private android.support.v7.app.ActionBarDrawerToggle mToggle;

private DatabaseReference mDatabase;

private RecyclerView recycler;

private Toolbar mToolbar;

private NavigationView nView;


@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_page);

    mDatabase = FirebaseDatabase.getInstance().getReference("landscape");

    recycler = findViewById(R.id.recyclerView);
    recycler.setLayoutManager(new LinearLayoutManager(this));
    //layoutManager = new GridLayoutManager(this,2);
    //recycler.setLayoutManager(layoutManager);
    recycler.setHasFixedSize(true);

    mToolbar = findViewById(R.id.toolbarNature);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setTitle("Landscape Wallpapers");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    mDraw = findViewById(R.id.drawerLayout);
    mToggle = new android.support.v7.app.ActionBarDrawerToggle(this, mDraw, mToolbar, R.string.open, R.string.close);

    mDraw.addDrawerListener(mToggle);
    mToggle.syncState();

    nView = findViewById(R.id.navigViewNature);

    nView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() 
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) 

            int id = item.getItemId();

            if(id == R.id.landscape_area)

                startActivity(getIntent());
            

            if(id == R.id.wallMoment)

                startActivity(new Intent(HomePage.this, AppMoment.class));
            

            if(id == R.id.minimal_area)

                //startActivity(new Intent(AppMoment.this, AppMoment.class));
            

            if(id == R.id.city_area)

                //startActivity(new Intent(AppMoment.this, AppMoment.class));
            

            if(id == R.id.mountain_area)

                //startActivity(new Intent(AppMoment.this, AppMoment.class));
            

            if(id == R.id.beach_area)

                //startActivity(new Intent(AppMoment.this, AppMoment.class));
            

            if(id == R.id.sea_area)

                //startActivity(new Intent(AppMoment.this, AppMoment.class));
            

            if(id == R.id.cars_area)

                //startActivity(new Intent(AppMoment.this, AppMoment.class));
            

            if(id == R.id.bikes_area)

                //startActivity(new Intent(AppMoment.this, AppMoment.class));
            

            return false;
        
    );



@Override
protected void onStart() 
    super.onStart();

    FirebaseRecyclerAdapter<GridItem, MyViewHoler> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<GridItem, MyViewHoler>(

            GridItem.class,
            R.layout.gridview_item_layout,
            MyViewHoler.class,
            mDatabase
    ) 
        @Override
        protected void populateViewHolder(MyViewHoler viewHolder, GridItem model, int position) 

            final String imageData = getRef(position).getKey();

            viewHolder.setImage(getApplicationContext(), model.getImage());


        
    ;

    recycler.setAdapter(firebaseRecyclerAdapter);
    recycler.setHasFixedSize(true);

    


public static class MyViewHoler extends RecyclerView.ViewHolder 

    View mView;


    public MyViewHoler(View itemView) 
        super(itemView);

        mView = itemView;
    

    public void setImage(Context ctx, String image)

        ImageView mImage = mView.findViewById(R.id.item_image);
        //Picasso.with(ctx).load(image).into(mImage);
        Glide.with(ctx).load(image).into(mImage);
    
  

我的 GridItem 类:

public class GridItem  

   private String image;

   public GridItem()

   

public GridItem(String image) 
    this.image = image;
   

public String getImage() 
    return image;
   

public void setImage(String image) 
    this.image = image;
   
 

这是数据库:

wallpapaersapp
-beach
-bikes
-cars
-city
-landscape
        image: "https://firebasestorage.googleapis.com/v0/b/wal..."
-minimal
-mountain
-sea
-wallmoment

【问题讨论】:

请编辑您的问题以在您的参考位置显示数据库的内容:/landscape "之前的一切都很完美" ?在什么之前? @DougStevenson 完成,最后我在 Firebase 上输入了数据库 @Barns 是的,一切正常。结束我写的数据库 @DougStevenson 好像它无法将图像 url 识别到数据库中,因为它说它无法将其转换为字符串 【参考方案1】:

FirebaseUI 正在执行您的查询以查找要显示的 /landscape 下的子项列表。您的代码假设每个孩子都可以映射到类型GridItem

但是,现在,您的那个位置有一个子节点,其值为字符串。单个字符串不能映射到 Java 对象。这就是您的错误的来源。更改数据库的结构以添加可以映射到数据模型的额外级别的子对象,或将 FirebaseUI 类型映射更改为字符串。

如果你想使用 GridItem,你的数据库应该是这样的:

-landscape
  - child1
    - image: "https://firebasestorage.googleapis.com/v0/b/wal..."
  - child2
    - image: "https://firebasestorage.googleapis.com/v0/b/wal..."

【讨论】:

毫无意义!在我以前的应用程序中,我做了同样的事情,在数据库参考中,我输入了他必须阅读的孩子,他阅读了关于那个孩子的所有信息......为什么它在这个项目中不起作用【参考方案2】:

只需在此处添加toString()

viewHolder.setImage(getApplicationContext(), model.getImage().toString());

或者你可以导入毕加索并添加这个

compile 'com.squareup.picasso:picasso:2.5.2'

然后

  @Override
        protected void populateViewHolder(MyViewHoler viewHolder, GridItem model, int position) 

            final String imageData = getRef(position).getKey();

           // viewHolder.setImage(getApplicationContext(), model.getImage());


        
    ;
Picasso.with(viewHolder.imageView.getContext()).load(model.getUrl()).into(viewHolder.imageView);  //where imageView is where you want to put your firebase image
                    
                ;

【讨论】:

以上是关于无法将 java.lang.String 类型的对象转换为 com.example 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;

无法将 java.lang.String 类型的对象转换为 com.example 类型

无法从类型 [java.lang.String] 转换为类型 [java.lang.Long]

无法将类型“java.lang.String”的属性值转换为属性“事务”所需的类型“java.util.List”

无法将类型“java.lang.String”的属性值转换为所需类型“java.util.Date”

无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型