滑动以删除仍显示带有垃圾箱的红色背景,recyclerview未更新

我已经实现了ItemToucherHelper.SimpleCallback,以在recyclerview中使用滑动手势来删除项目并在删除后更新UI。不幸的是,刷卡后红色背景和垃圾桶仍然可见,并且recyclerview没有更新。

我已经在onSwipe()和适配器本身中尝试了notifyDataSetChanged(),也尝试了notifyItemChanged(position)和notifyItemRemoved(position),但没有任何变化。

FeedAdapter.java

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;

import org.quietlip.voicescapstone.R;
import org.quietlip.voicescapstone.models.AudioModel;

import java.util.List;

import static com.firebase.ui.auth.AuthUI.TAG;

public class FeedAdapter extends RecyclerView.Adapter<FeedViewHolder> {
    private List<AudioModel> audioList;

    public FeedAdapter(List<AudioModel> audioList) {
        this.audioList = audioList;
    }

    @NonNull
    @Override
    public FeedViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,int i) {
        View view =
                LayoutInflater.from(viewGroup.getcontext()).inflate(R.layout.feed_recording_item,viewGroup,false);
        return new FeedViewHolder(view);

    }

    @Override
    public void onBindViewHolder(@NonNull FeedViewHolder feedViewHolder,int i) {
        feedViewHolder.onBind(audioList.get(i));
    }

    @Override
    public int getItemCount() {
        return audioList.size();
    }

    public void deleteItem(int position) {
        AudioModel recentlyDeletedItem = audioList.get(position);

        if (recentlyDeletedItem != null && recentlyDeletedItem.getaudioId() != null) {
            StorageReference stRef =
                    FirebaseStorage.getInstance().getReference(recentlyDeletedItem.getUser().getUserId())
                            .child("audio").child(recentlyDeletedItem.getaudioId());
            stRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {

                }
            });

            FirebaseFirestore firestore = FirebaseFirestore.getInstance();
            firestore.collection("users").document(recentlyDeletedItem.getUser().getUserId())
                    .collection("audio").document(recentlyDeletedItem.getaudioId())
                    .delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                }
            });
            audioList.remove(position);
            notifyItemChanged(position);

        }
    }
}

FeedSwipeDelete.java

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.ItemTouchHelper;
import android.util.Log;
import android.view.View;

import org.quietlip.voicescapstone.R;
import org.quietlip.voicescapstone.recyclerview.FeedAdapter;

public class FeedSwipeDelete extends ItemTouchHelper.SimpleCallback {
    private static final String TAG = "Swipe";
    private FeedAdapter feedAdapter;
    private Drawable icon;
    private final ColorDrawable background;

    public FeedSwipeDelete(FeedAdapter adapter,Context context) {
        super(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
        this.feedAdapter = adapter;
        icon = ContextCompat.getDrawable(context,R.drawable.ic_delete);
        background = new ColorDrawable(Color.RED);
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder,int i) {
        int position = viewHolder.getadapterPosition();
        feedAdapter.deleteItem(position);
        feedAdapter.notifyItemChanged(position);
//        feedAdapter.notifyDataSetChanged();
//        feedAdapter.notifyItemRemoved(position); 
    }

    @Override
    public boolean onmove(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder,@NonNull RecyclerView.ViewHolder viewHolder1) {
        return true;
    }

    @Override
    public void onChildDraw(@NonNull Canvas c,@NonNull RecyclerView recyclerView,float dX,float dY,int actionState,boolean isCurrentlyactive) {

        View itemView = viewHolder.itemView;
        int backgroundCornerOffset = 20;
        int iconmargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2;
        int iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2;
        int iconBottom = iconTop + icon.getIntrinsicHeight();

        if (dX > 0) {
            int iconLeft = itemView.getLeft() + iconmargin;
            int iconRight = iconLeft + icon.getIntrinsicWidth();
            icon.setbounds(iconLeft,iconTop,iconRight,iconBottom);
            background.setbounds(itemView.getLeft(),itemView.getTop(),itemView.getLeft() + ((int) dX) + backgroundCornerOffset,itemView.getBottom());
        } else if (dX < 0) {
            int iconLeft = itemView.getRight() - iconmargin - icon.getIntrinsicWidth();
            int iconRight = itemView.getRight() - iconmargin;
            icon.setbounds(iconLeft,iconBottom);
            background.setbounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset,itemView.getRight(),itemView.getBottom());
        }  else {
            background.setbounds(0,0);
            icon.setbounds(0,0);
        }
        background.draw(c);
        icon.draw(c);

        super.onChildDraw(c,recyclerView,viewHolder,dX,dY,actionState,isCurrentlyactive);
    }
}

FeedViewHolder.java

public class VoicesViewHolder extends RecyclerView.ViewHolder {
    private static final String TAG = "PROUD";

    private ImageView playIv;
    private TextView title;
    private CircleImageView profilePic;
    private TextView username;
    private ImageView commentMic;
    private TextView timeStamp;

    private MediaPlayer mediaPlayer;

    private String audioId;
    private String pathId;
    private StorageReference stRef;
    private UserModel user1;
    private AudioViewModel viewModel;

    public VoicesViewHolder(@NonNull View itemView) {
        super(itemView);
        playIv = itemView.findViewById(R.id.profile_play_btn);
        title = itemView.findViewById(R.id.profile_title);
        profilePic = itemView.findViewById(R.id.profile_image);
        username = itemView.findViewById(R.id.profile_username);
        timeStamp = itemView.findViewById(R.id.time_stamp);
        commentMic = itemView.findViewById(R.id.profile_comments_btn);
        mediaPlayer = new MediaPlayer();
    }

    public void onBind(final AudioModel audio) {
        title.setText(audio.getTitle());
        audioId = audio.getaudioId();
        pathId = audio.getPathId();
        viewModel = new AudioViewModel(audio);
        timeStamp.setText(viewModel.getTimeStamp());
        user1 = CurrentUserManager.getcurrentUser();
        if (user1 != null) {
            username.setText(user1.getusername());
            Picasso.get().load(user1.getImageUrl()).fit().into(profilePic);
        }
        playIv.setOnClicklistener(new View.OnClicklistener() {
            //Create a loading spinner in place of the play button to indicate that audio is loading
            @Override
            public void onClick(View v) {
                if (user1 != null) {
                    stRef = FirebaseStorage.getInstance().getReference(user1.getUserId())
                            .child("audio").child(audioId);
                    Log.d(TAG,"onClick: " + audioId);
                    stRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            if (!mediaPlayer.isPlaying()) {
                                playIv.setImageResource(R.drawable.ic_stopp);
                                startPlaying(uri);
                            } else {
                                playIv.setImageResource(R.drawable.play_button);
                                mediaPlayer.stop();
                            }
                        }
                    });
                }
            }
        });

        commentMic.setOnClicklistener(new View.OnClicklistener() {
            @Override
            public void onClick(View v) {
                goToCommentactivity();

            }
        });
    }

    private void startPlaying(Uri audio) {
        mediaPlayer = new MediaPlayer();
        if (mediaPlayer != null) {
            try {
                mediaPlayer.setDataSource(itemView.getcontext(),audio);
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mediaPlayer.start();
                        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            @Override
                            public void onCompletion(MediaPlayer mp) {
                                playIv.setImageResource(R.drawable.play_button);
                                mediaPlayer.reset();
                            }
                        });
                    }
                });
                mediaPlayer.prepareAsync();
                Log.d("VIEW HOLDER",String.valueOf(mediaPlayer.isPlaying()));
            } catch (IOException e) {
                Log.e("VIEW HOLDER","prepare() failed");
            }
        } else {
            Log.d(TAG,"startPlaying: null");
        }
    }

    private void stopPlaying() {
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    private void goToCommentactivity() {
        Intent commentactivityIntent = new Intent(itemView.getcontext(),Commentactivity.class);
        Log.d(TAG,"goToCommentactivity: Jose says goToCommentactivity " + user1);
        if(null != user1) {
            commentactivityIntent.putExtra("userid",user1.getUserId());
            commentactivityIntent.putExtra("audioid",audioId);
            commentactivityIntent.putExtra("pathid",pathId);
            itemView.getcontext().startactivity(commentactivityIntent);
        } else {
            Intent intent = new Intent(itemView.getcontext(),Loginactivity.class);
            FirebaseAuth.getInstance().signOut();
            itemView.getcontext().startactivity(intent);
        }
    }
}

我在stacktrace中没有看到任何错误消息,应该在recyclerview中将其删除,但是没有。 screenshot

charlescyc 回答:滑动以删除仍显示带有垃圾箱的红色背景,recyclerview未更新

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3127598.html

大家都在问