java - 应用程序在到达 RecyclerView Android 的末尾时停止
问题描述
当我滚动浏览 RecyclerView 中的卡片时,该应用程序运行良好,但是一旦 RecyclerView 到达最后一张卡片,应用程序就会崩溃。我的意思是,当我到达 RecyclerView 的底部时,应用程序会继续崩溃。日志猫说
com.google.firebase.database.DatabaseException:
无法将 java.lang.String 类型的对象转换为 com.pappu5.navigation.PostActivity 类型
有什么方法可以解决这个问题?在此先感谢:) 日志
06-21 12:08:19.799 21292-21292/com.pappu5.navigation E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pappu5.navigation, PID: 21292
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.pappu5.navigation.PostActivity
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@17.0.0:418)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@17.0.0:214)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@17.0.0:79)
at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@17.0.0:212)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35)
at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106)
at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:285)
at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:342)
at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:358)
at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:365)
at android.support.v7.widget.GapWorker.run(GapWorker.java:396)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
PostActivity.java
package com.pappu5.navigation;
import com.google.firebase.firestore.ServerTimestamp;
import java.util.Date;
public class PostActivity {
public String image,thumb_image,desc,user;
//public Date timestamp;
public PostActivity(){
}
public PostActivity(String image, String thumb_image, String desc, String user) {
this.image = image;
this.thumb_image = thumb_image;
this.desc = desc;
this.user = user;
//this.timestamp = timestamp;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getThumb_image() {
return thumb_image;
}
public void setThumb_image(String thumb_image) {
this.thumb_image = thumb_image;
}
public String getDesc() {
if(desc!=null){
return desc;
}else{
return "This is Null";
}
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
/*public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}*/
}
HomeFragment.java
public class HomeFragment extends Fragment {
private RecyclerView rv;
private TextView username,date,desc;
private CircleImageView postImage;
private ImageView postBigImage;
private CardView postCard;
private List<PostActivity> postItems;
private DatabaseReference dr;
private StorageReference sr;
private FirebaseUser user;
FirebaseRecyclerAdapter<PostActivity, PostsHolder> fra;
private PostAdapter pa;
public HomeFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_home, container, false);
sr = FirebaseStorage.getInstance().getReference();
user = FirebaseAuth.getInstance().getCurrentUser();
String id = user.getUid();
AddPost ap = new AddPost();
dr = FirebaseDatabase.getInstance().getReference().child("Posts");
postItems = new ArrayList<>();
pa = new PostAdapter(postItems);
rv =view.findViewById(R.id.rvPostItems);
rv.setLayoutManager(new LinearLayoutManager(getActivity()));
Query personsQuery = dr.orderByKey();
FirebaseRecyclerOptions<PostActivity> options =
new FirebaseRecyclerOptions.Builder<PostActivity>().setLifecycleOwner(this)
.setQuery(personsQuery, PostActivity.class)
.build();
fra = new FirebaseRecyclerAdapter<PostActivity, PostsHolder>(
options
) {
@Override
protected void onBindViewHolder(@NonNull PostsHolder holder, int position, @NonNull PostActivity model) {
holder.setDesc(model.getDesc());
}
@NonNull
@Override
public PostsHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.post_items, parent, false);
return new PostsHolder(view);
}
};
rv.setAdapter(fra);
return view;
}
public class PostsHolder extends RecyclerView.ViewHolder{
View view;
private TextView de;
public PostsHolder(View itemView) {
super(itemView);
view=itemView;
}
public void setDesc(String descText){
de = view.findViewById(R.id.postDesc);
de.setText(descText);
}
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
解决方案
Ogbe 评论的内容几乎是全部。
正如错误消息所说,问题在于您正在尝试将数据库中的字符串转换为 a PostActivity
,这是不可能的。
您很可能在Posts
. 删除它,问题应该会消失。
这也是了解Firebase 安全规则的好时机,因为验证规则是防止此类畸形数据的好方法。
推荐阅读
- docker - 是否可以挂载 pip 库的安装位置,以便库在运行 Jupyterlab 的 docker 容器中持久存在?
- apache-spark - pyspark用空字符串替换重复的反斜杠字符
- node.js - 修复 Bootstrap 中文本的宽度
- javascript - 当某人有太多角色无法嵌入嵌入时,如何发送“无法显示的角色太多”消息?
- aws-lambda - 定义类似于请求模式的无服务器框架 Api Gateway 响应模式
- c# - C# - 按公共属性分组到对象
- amazon-web-services - AWS 中的 CICD - GitHub 到 Lambda
- r - 提取字符串的组件并填写R中缺少的地方
- r - 如何解释逻辑回归的系数
- flutter - 如何从我现有的帐户在 firebase 中注册新用户?