首页 > 解决方案 > 调用 adapter.notifyItemChanged(position); 工作很奇怪

问题描述

我有一个从 firebase 获得的列表,这个列表是关于帖子的,我需要的是当用户喜欢或不喜欢它时,通过适配器更新列表。因为我使用 recyclerview 和适配器在从 firebase 接收数据后显示我的数据。实际上,一切对我来说都很好,但是当用户喜欢或不喜欢帖子时,这个问题就会变得疯狂。我试着祝酒以确保我的工作与我预期的相同,这证明我是对的。

帖子的照片通过点击视频显示的“喜欢”按钮出现和消失,并且它没有以正确的方式更新数据,就像它与喜欢的数量一样

您可以在下面通过视频找到我的代码,以说明我面临的问题。

我希望有人可以帮助我。

这就是我所说的工作如此奇怪的意思

private void read_posts() {


    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");

    reference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            //post_models.clear();

                Post_Model post_model = dataSnapshot.getValue(Post_Model.class);


                post_models.add(post_model);


            post_adapter = new Post_Adapter(post_models, getContext());
            recyclerviewNewsfeed.setAdapter(post_adapter);

            progressBar.setVisibility(View.GONE);




        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {


            Post_Model post_model = dataSnapshot.getValue(Post_Model.class);



            for (int i=0;i<post_models.size();i++){

                if(post_models.get(i).getId().equals(post_model.getId())){





                    post_models.set(i,post_model);

                    post_adapter.notifyItemChanged(i);


                    break;


                }



            }






        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }


    });







}

这是我的帖子适配器

public class Post_Adapter extends RecyclerView.Adapter<Post_Adapter.Viewholder> {



private Context context;

private List<Post_Model> post_models;

FirebaseUser firebaseUser;

List<Like_Model> like_modelList, likeblue_modelList;


View_Photos_Adapter view_Photos_adapter;

boolean userlikeit;

public static int positionn=-1;

public Post_Adapter(List<Post_Model> post_models, Context context) {
    this.context = context;
    this.post_models = post_models;
}

@NonNull
@Override
public Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(context).inflate(R.layout.post_item, parent, false);


    return new Viewholder(view);

}


@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull final Viewholder holder, final int position) {


    final Post_Model post_model = post_models.get(position);


    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();



    DatabaseReference referencee = FirebaseDatabase.getInstance().getReference("Posts").child(post_model.getId());

    referencee.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            //Toast.makeText(CommentActivity.this, post_id+"", Toast.LENGTH_SHORT).show();




                Post_Model post_modell = dataSnapshot.getValue(Post_Model.class);



                    // Toast.makeText(CommentActivity.this, post_id+"", Toast.LENGTH_SHORT).show();


                    if (post_modell.getLikeModels() != null) {

                        for (int i = 0; i < post_modell.getLikeModels().size(); i++) {

                            if (post_modell.getLikeModels().get(i).getUserid().equals(firebaseUser.getUid())) {

                                userlikeit = true;

                                break;

                            } else {

                                userlikeit = false;

                            }

                        }


                    } else {

                        userlikeit = false;

                    }

                    //snapshot.getRef().removeValue();






            // Toast.makeText(context, userlikeit+"58", Toast.LENGTH_SHORT).show();
            //Toast.makeText(CommentActivity.this, comment_models.size()+"", Toast.LENGTH_SHORT).show();


            if (userlikeit) {

                holder.likebluebtn.setVisibility(View.VISIBLE);

                holder.likebtn.setVisibility(View.GONE);

            } else {

                holder.likebtn.setVisibility(View.VISIBLE);

                holder.likebluebtn.setVisibility(View.GONE);


            }


        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });


    if (post_model.getUserid().equals(firebaseUser.getUid())) {

        holder.editbtn.setVisibility(View.VISIBLE);
        holder.deletebtn.setVisibility(View.VISIBLE);

    } else {

        holder.editbtn.setVisibility(View.GONE);
        holder.deletebtn.setVisibility(View.GONE);

    }





    holder.editbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            holder.postTextView.setVisibility(View.GONE);

            holder.postEditText.setVisibility(View.VISIBLE);

            holder.postEditText.setText(post_model.getPost());

            holder.editbtn.setVisibility(View.GONE);

            holder.savebtn.setVisibility(View.VISIBLE);


        }
    });


    holder.savebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            Post_Model post_modell = new Post_Model(post_model.getId(), post_model.getUserid()
                    ,  holder.postEditText.getText().toString(), post_model.getTime()
                    , post_model.getCommentModels(), post_model.getPostphotos(), post_model.getLikeModels());

            FirebaseDatabase.getInstance().getReference("Posts")
                    .child(post_model.getId())
                    .setValue(post_modell);

            holder.postTextView.setVisibility(View.VISIBLE);

            holder.postEditText.setVisibility(View.GONE);

            holder.editbtn.setVisibility(View.VISIBLE);

            holder.savebtn.setVisibility(View.GONE);


            Toast.makeText(context, "Post has been edited successfully", Toast.LENGTH_SHORT).show();

            Intent intent = new Intent(context, NewsfeedActivity.class);

            context.startActivity(intent);

            ((Activity) context).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_in_left);


            ((Activity) context).finish();

        }
    });


    holder.deletebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            new AlertDialog.Builder(context)
                    .setTitle("Delete Post")
                    .setMessage("Are you sure you want to delete this post?")

                    // Specifying a listener allows you to take an action before dismissing the dialog.
                    // The dialog is automatically dismissed when a dialog button is clicked.
                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                            final DatabaseReference referencee = FirebaseDatabase.getInstance().getReference("Posts")
                                    .child(post_model.getId());

                            referencee.removeValue();


                            Toast.makeText(context, "Post deleted successfully", Toast.LENGTH_LONG).show();

                            Intent intent = new Intent(context, NewsfeedActivity.class);

                            context.startActivity(intent);

                            ((Activity) context).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_in_left);

                            ((Activity) context).finish();

                        }
                    })

                    // A null listener allows the button to dismiss the dialog and take no further action.
                    .setNegativeButton(android.R.string.no, null)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .show();


        }

    });


    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    like_modelList = new ArrayList<>();

    likeblue_modelList = new ArrayList<>();


    //Toast.makeText(context, read_likes(post_model.getId())+"", Toast.LENGTH_SHORT).show();


    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                User user = snapshot.getValue(User.class);

                // Toast.makeText(Create_Coworking_SpaceActivity.this, "111111111", Toast.LENGTH_LONG).show();


                if (user.getId().equals(post_model.getUserid())) {

                    if (user.getImageURL().equals("default")) {

                        holder.userImage.setImageResource(R.drawable.ic_imgprofile);

                    } else {

                        Glide.with(holder.itemView).load(user.getImageURL()).into( holder.userImage);

                    }

                    holder.username.setText(user.getUsername());

                }


            }


        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    if (post_model.getPostphotos() == null) {

        holder.postPhotosRC.setVisibility(View.GONE);

    } else {

        holder.postPhotosRC.setHasFixedSize(true);
        holder.postPhotosRC.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));

        view_Photos_adapter = new View_Photos_Adapter(post_model.getPostphotos(), context);

        holder.postPhotosRC.setAdapter(view_Photos_adapter);
    }


    holder.postTextView.setText(post_model.getPost());

    holder.posttimeTextView.setText(post_model.getTime());


    holder.commentbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            Intent intent = new Intent(context, CommentActivity.class);


            intent.putExtra("post_id", post_model.getId());


            context.startActivity(intent);

            ((Activity) context).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_in_left);


        }
    });

    if (post_model.getCommentModels() != null) {

        holder.numofcommentsEditText.setText(post_model.getCommentModels().size() + "");

        holder.numofcommentsTextView.setText(post_model.getCommentModels().size() + "");
    }


    final int[] li = {0};

    holder.likebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {



            like(post_model.getId());

           // Post_Adapter.this.notifyItemChanged(position);

            positionn=position;


        }
    });


    holder.likebluebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //Toast.makeText(context, userlikeit+"5", Toast.LENGTH_SHORT).show();

            unlike(post_model.getId());

           // Post_Adapter.this.notifyItemChanged(position);

            positionn=position;

        }
    });

    if (post_model.getLikeModels() != null) {

        holder.numoflikesEditText.setText(post_model.getLikeModels().size() + "");

        holder.numoflikesTextView.setText(post_model.getLikeModels().size() + "");
    }


    holder.likesTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(context, LikeActivity.class);


            intent.putExtra("post_id", post_model.getId());


            context.startActivity(intent);

            ((Activity) context).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_in_left);


        }
    });



    holder.commentsTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            Intent intent = new Intent(context, CommentActivity.class);


            intent.putExtra("post_id", post_model.getId());


            context.startActivity(intent);

            ((Activity) 
     context).overridePendingTransition(R.anim.slide_in_right, 
         R.anim.slide_in_left);


        }
    });



}

@Override
public int getItemCount() {
    return post_models == null ? 0 : post_models.size();
}

标签: javaandroidfirebase

解决方案


推荐阅读