- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我来寻求您对我的申请中遇到的问题的帮助。 问题是这样的:新闻源上的帖子位于此捕获中的此帖子 -> [postid] 位置下的数据库中 ,当用户保存帖子时,它在数据库中的存储方式如下:用户 -> [userid] -> 保存 -> [postid],如您在此屏幕截图中看到的 .
我希望根据用户保存的帖子 ID,他可以检索这些帖子的信息详细信息(如帖子描述)并将其显示在我的应用程序的“保存” fragment 中。 这是我尝试做的事情
保存 fragment 适配器
package com.ackerman.ubi.Adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.ackerman.ubi.Model.PostModel;
import com.ackerman.ubi.R;
import com.bumptech.glide.Glide;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SaveAdapter extends RecyclerView.Adapter<SaveAdapter.ViewHolder> {
private Context mContext;
private List<PostModel> mPostModel;
public SaveAdapter(Context mContext, List<PostModel> mPostModel) {
this.mContext = mContext;
this.mPostModel = mPostModel;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_save, parent, false);
return new SaveAdapter.ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
PostModel post = mPostModel.get(position);
adaptSave(post, holder.post_image, holder.description, holder.price, holder.location, holder.product_state, holder.title);
}
@Override
public int getItemCount() {
return mPostModel.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
ImageView post_image;
TextView description, price, location, product_state, title;
ViewHolder(@NonNull View itemView) {
super(itemView);
post_image = itemView.findViewById(R.id.post_image);
description = itemView.findViewById(R.id.description);
price = itemView.findViewById(R.id.price);
location = itemView.findViewById(R.id.location);
product_state = itemView.findViewById(R.id.product_state);
title = itemView.findViewById(R.id.title);
}
}
//END OF ADAPTER SECTION
//METHOD SECTION
/**
* Methode permettat d'adapter les sauvegarde
*
* @param post
* @param postImage
* @param description
* @param price
* @param location
* @param productState
* @param title
*/
private void adaptSave(final PostModel post, final ImageView postImage, final TextView description, final TextView price, final TextView location, final TextView productState, final TextView title) {
Glide.with(mContext).load(post.getPostimage()).into(postImage);
//description.setText(post.get("description").toString());
// price.setText(post.get("price").toString());
// location.setText(post.get("location").toString());
// productState.setText(post.get("product_state").toString());
// title.setText(post.get("title").toString());
// description.setText(post.getDescription());
// title.setText(post.getTitle());
//
// price.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_price_tag_post, 0, 0);
// price.setText(post.getPrice());
//
// location.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_placeholder_post, 0, 0);
// location.setText(post.getLocation());
//
// getProductState(post, productState);
}
/**
* Methode permettant de verifier l'etat du produit
*
* @param post
* @param productState
*/
private void getProductState(PostModel post, TextView productState) {
String product_state = post.getProduct_state();
if (product_state.equals("Neuf")) {
productState.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_box_new_post, 0, 0);
} else {
productState.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_box_used_post, 0, 0);
}
}
}
保存 fragment
package com.ackerman.ubi.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.ackerman.ubi.Adapter.SaveAdapter;
import com.ackerman.ubi.Model.PostModel;
import com.ackerman.ubi.R;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import es.dmoral.toasty.Toasty;
public class SaveFragment extends Fragment {
private List<PostModel> saveList;
private SaveAdapter saveAdapter;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_save, container, false);
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(linearLayoutManager);
saveList = new ArrayList<>();
saveAdapter = new SaveAdapter(getContext(), saveList);
recyclerView.setAdapter(saveAdapter);
getSaves();
return view;
}
/**
* Methode permettant de recuperer toute les sauvegardes de l'utilisateur
*/
private void getSaves() {
String userid = FirebaseAuth.getInstance().getCurrentUser().getUid(); //Recuperation de l'ID de l'utilisateur
//Reference de l'emplacement des posts, Users -> ID de l'utilisateur -> saves
DatabaseReference saveReference = FirebaseDatabase.getInstance().getReference("Users").child(userid).child("saves");
saveReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
saveList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
PostModel save = snapshot.getValue(PostModel.class);
saveList.add(save);
saveAdapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
后模型
package com.ackerman.ubi.Model;
public class PostModel {
//Ensemble des attribus que peut avoir un post
private String postid, postimage, description, publisher, location, price, product_state, title;
//Constructeur vide (Obligatoire(pour une initialisation))
public PostModel() {
}
/**
* Constructeur contenant les attributs de nos post
*
* @param postid
* @param postimage
* @param description
* @param publisher
* @param location
* @param price
* @param product_state
* @param title
*/
public PostModel(String postid, String postimage, String description, String publisher, String location, String price, String product_state, String title) {
this.postid = postid;
this.postimage = postimage;
this.description = description;
this.publisher = publisher;
this.location = location;
this.price = price;
this.product_state = product_state;
this.title = title;
}
//Les getters et les setters
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getProduct_state() {
return product_state;
}
public void setProduct_state(String product_state) {
this.product_state = product_state;
}
public String getPostid() {
return postid;
}
public void setPostid(String postid) {
this.postid = postid;
}
public String getPostimage() {
return postimage;
}
public void setPostimage(String postimage) {
this.postimage = postimage;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
}
但我收到此错误。我得到的错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ackerman.ubi, PID: 6313
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.ackerman.ubi.Model.PostModel
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@19.1.0:418)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.1.0:214)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.1.0:79)
at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@19.1.0:203)
at com.ackerman.ubi.Fragment.SaveFragment$1.onDataChange(SaveFragment.java:73)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.1.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.1.0:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.1.0:55)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6688)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
错误发生在这一行“Postmodel save = snapshot.getValue (PostModel.class);”在 SaveFragment 中
如果毫不犹豫地问我问题,我希望我是可以理解的。谢谢
最佳答案
看起来错误来自这一行:
PostModel save = snapshot.getValue(PostModel.class);
此行从 FirebaseDatabase.getInstance().getReference("Users").child(userid).child("saves")
加载数据,即路径 /Users/$uid/保存
。在屏幕截图中的该路径下,我看到这样的结构:
因此,当您循环 dataSnapshot.getChildren()
时,每个单独的值都只是一个字符串。您的 PostModel
类的属性比此位置中存在的属性多得多,这就是为什么 Firebase 告诉您它 Can't conversion object of type java.lang.String to type com.ackerman.ubi .Model.PostModel
.
如果要加载此 ID 引用的帖子,则需要对数据库进行额外调用:
String modelKey = snapshot.getValue(String.class);
DatabaseReference postRef = FirebaseDatabase.getInstance().getReference("Posts").child(modelKey);
postRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot postSnapshot) {
PostModel save = postSnapshot.getValue(PostModel.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
}
关于java - 火力 : get data details from another child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59258442/
这是我的代码。 1 Demo 1 2 Demo 2 3 Demo 3 我想做的是——如果任何一个的细节标签已打开,我打开/查看另一个 标签,那么较早的标签应该关闭/
我正在尝试构建一个 iPad Master-Detail 应用程序。主视图只是一个 TableViewController。我想为用户在主视图中点击的每个不同单元格更改完整的详细信息 View 。其中
我目前在我的子主题的 functions.php 文件中有一些代码,它应该在我的 WooCommerce 结帐页面上将“账单详细信息”更改为“运输详细信息”。 但是,当我更新到 WooCommerce
我想刷新 MasterDetail 项目中的详细信息页面。 (在模态 Controller 中进行编辑后应刷新详细信息。)我知道将代码块放在详细信息页面中的何处以强制刷新。我只是不知道要使用什么代码来
我的应用程序中有一个主从模式,但我希望细节能够切换 View 。我想尽可能多地节省空间,以便“内容”既漂亮又宽敞。 如何从一个“细节”导航到另一个“细节”,同时让“向上”按钮返回“主”列表?(参见“细
在过去,我有一个包含这样一个表的数据库: ProductID | ProductName | InStockWareHouse1 | InstockWareHouse2 ---------------
boost::details::pool::pthread_mutex 和 boost::details::pool::null_mutex 有什么区别。 我看到在最新的 boost 版本 - 1.4
我只获取数据源的详细信息,但没有获取 google fit 消耗的卡路里。如何获得燃烧卡路里的详细信息。我可以从( Google Fitness API returns only {} as resu
我刚刚在 Xcode 5 中创建了一个新的“Master-Detail application”项目。 然后在我的主视图 Controller 上,我将 TableView 更改为静态,并添加了一些项
我试图在“me”/me 部分下命名多个路由,以便在此命名空间下拥有所有基于用户配置文件/帐户的内容,以实现更干净的路由。 解决这个问题的最佳方法是什么?我发现重写默认的 REST 路由(profile
所以我是 Android 开发的新手,并试图了解主/细节流程设计。因此,我使用 Eclipse 为您创建的默认类 - 因此 ScreenDetailActivity、ScreenDetailFragm
我使用 var contacts:[details] 编写代码? = nil 我遇到了无法访问 contacts?.count 的问题,我不得不在任何地方使用可选值。例如 contacts[index
我已经成功地将 www.my-website/blog.php 重写为 www.my-website/blog 现在,我想对我的 blog-detail.php 页面做进一步的事情 从 www.my-
在问这个问题之前,我想说 this stackoverflow 中的问题与我的问题非常相似,但概念仍然不清楚,非常困惑。 我想了解依赖倒置原则,但我无法完全理解它? 下面是DIP说的两点 A. Hig
我是 SYCL/OpenCL/GPGPU 的新手。我正在尝试构建和运行常量加法程序的示例代码, #include #include #include #include namespace sy
我正在使用这个 Ray Wenderlich tutorial作为我正在从事的项目的指南。但是,我正在尝试扩展此模板以合并子目录、子子目录、子子子目录等。 例如,如果您单击主/主目录屏幕中的“Cand
我正在尝试创建一个小扩展,以便我可以从详细 View Controller 访问主视图 Controller 以更新变量。 import UIKit extension UISplitViewCont
我正在尝试基于由 MySQL 数据库支持的 Entity Framework 6 DbContext 实现基本的主从 View 。表格配置尽可能简单: 我的测试应用程序的表单包含两个 ComboBox
我知道这是一个老问题并且已经answered在 objective-c 中。但我正在寻找 Swift 中的解决方案。我在 AppDelegate 中的 splitviewController 代码如下
我的句子很少。在第一句话的结尾(在这一行),我想添加剧透,这将保留故事的其他部分。我正在尝试这样做,但是当单击更多时.. - 我的文本跳到下一行。我需要在一行中继续文本更多...请不要告诉我任何脚本,
我是一名优秀的程序员,十分优秀!