java - Android应用程序标签切换崩溃

标签 java android firebase tabs

我的应用程序当前出现错误。我有一个 recyclerview,它从 firebase 数据库加载帖子并显示它们。当我切换 fragment 和 Activity 时,我没有收到任何错误。当我单击手机上的主页按钮或选项卡按钮,然后单击返回我的应用程序时,出现崩溃并显示错误消息,

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{777f444 position=1 id=-1, oldPos=0, pLpos:0 scrap [attachedScrap] tmpDetached no parent} android.support.v7.widget.RecyclerView{efb45c8 VFED..... .F...... 0,0-1080,1497 #7f0900c2 app:id/postList}, adapter:com.sender.hp.sender.DashboardFragment$2@efd661, layout:android.support.v7.widget.LinearLayoutManager@9760586, context:com.sender.hp.sender.MainActivity@720f0fa

每当我点击手机上的后退按钮并且我的应用程序关闭时,如果我进入我的选项卡并返回我的应用程序,它就可以正常工作。我没有 onBackPressed 监听器。 这是我的代码,

firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<postsGetInfo, postsGetInfoViewHolder>(postsGetInfo.class, R.layout.posts_layout,postsGetInfoViewHolder.class,postRef) {
                @Override
                protected void populateViewHolder(final postsGetInfoViewHolder viewHolder, postsGetInfo model, int position) {
                    TextView txtUpvote = (TextView) viewHolder.myView.findViewById(R.id.txtUpvoteCount);
                    final String postKey = getRef(position).getKey();
                    viewHolder.setUsername(model.getUsername());
                    viewHolder.setTime(model.getTime());
                    viewHolder.setDate(model.getDate());
                    viewHolder.setDescription(model.getDescription());
                    viewHolder.setProfileImage(model.getProfileimage());
                    viewHolder.setImage(model.getImage());
                    viewHolder.setDisplayvotes(model.getDisplayvotes());
                    viewHolder.myView.findViewById(R.id.imgDownvote).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                           UpdateTheDisplayVotes(postKey);
                           ++getDownvotes;
                           --getDisplayVotes;
                           String txtDisplayVotes = Integer.toString(getDisplayVotes);
                           postRef.child(postKey).child("downvotes").setValue(getDownvotes);
                           postRef.child(postKey).child("displayvotes").setValue(txtDisplayVotes);
                        }
                    });
                    viewHolder.myView.findViewById(R.id.imgUpvote).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            UpdateTheDisplayVotes(postKey);
                            ++getUpvotes;
                            ++getDisplayVotes;
                            String txtDisplayVotes = Integer.toString(getDisplayVotes);
                            postRef.child(postKey).child("upvotes").setValue(getUpvotes);
                            postRef.child(postKey).child("displayvotes").setValue(txtDisplayVotes);
                        }
                    });

                    viewHolder.myView.findViewById(R.id.imgPost).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            Intent editIntent = new Intent((getActivity()),postEdit.class);
                            editIntent.putExtra("PostKey",postKey);
                            startActivity(editIntent);                                      
                        }
                    });
                }
            };
        postList.setAdapter(firebaseRecyclerAdapter);
        }

private void UpdateTheDisplayVotes(final String key) {
    VoteListener = postRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                if (dataSnapshot.hasChild("displayvotes")){
                displayvotes = dataSnapshot.child(key).child("displayvotes").getValue().toString();
                    getDisplayVotes = Integer.parseInt(displayvotes);
                }
                if (dataSnapshot.hasChild("upvotes")){
                upvotes = dataSnapshot.child(key).child("upvotes").getValue().toString();
                    getUpvotes = Integer.parseInt(upvotes);
                }
                if (dataSnapshot.hasChild("downvotes")){
                    downvotes = dataSnapshot.child(key).child("downvotes").getValue().toString();
                    getDownvotes = Integer.parseInt(downvotes);
                }
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

@Override
public void onStart() {
    super.onStart();
    firebaseRecyclerAdapter.startListening();

}
@Override
public void onStop() {
    super.onStop();
    if (firebaseRecyclerAdapter != null){
        firebaseRecyclerAdapter.cleanup();
    }
}

有人知道怎么解决吗?感谢您的回答!

最佳答案

清除适配器或适配器中的列表时会出现此错误。

清除适配器时调用notifyDataSetChanged()

@Override 
public void onStop() { 
    super.onStop(); 
    if (firebaseRecyclerAdapter != null){ 
        firebaseRecyclerAdapter.cleanup(); 
        firebaseRecyclerAdapter.notifyDataSetChanged();
    } 
} 

关于java - Android应用程序标签切换崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50304195/

相关文章:

安卓相机 : data intent returns null

javascript - 在 Firebase 中加载数据时运行 JQuery

java - 在线文件夹系统的设计

java - Android - 任务 ':app:transformClassesWithMultidexlistForDebug' 执行失败

java - JavaFX 在不同屏幕上的不同尺寸

android - 如何将Uri图像压缩为位图

java - Android 谷歌地图在生产时显示白屏

java - 如何在我自己的项目中引用来自供应商的 WAR

javascript - 如何使用下面的代码仅选择集合中的特定文档?

ios - 为数组中的每个字符串获取 firebase 数据