Размах для удаления по-прежнему показывает красный фон с мусорным баком, не обновляется просмотрщик - PullRequest
0 голосов
/ 10 ноября 2019

Я реализовал ItemToucherHelper.SimpleCallback, чтобы использовать жест смахивания внутри моего окна повторного просмотра для удаления элемента и обновления пользовательского интерфейса после удаления. К сожалению, красный фон и мусорное ведро все еще видны после смахивания, а просмотр реселлера не обновляется.

Я пробовал notifyDataSetChanged () как в onSwipe (), так и в самом адаптере. также пытался notifyItemChanged (позиция) и notifyItemRemoved (позиция), но без изменений.

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,
                            @NonNull RecyclerView.ViewHolder viewHolder, 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, iconTop, iconRight, iconBottom);
            background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset,
                    itemView.getTop(), itemView.getRight(), itemView.getBottom());
        }  else {
            background.setBounds(0, 0, 0, 0);
            icon.setBounds(0, 0, 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);
        }
    }
}

Я не вижу сообщений об ошибках в трассировке стека, он должен быть удален в обзоре реселлера, но это не так. Скриншот

...