无法将 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 类型