Я реализовал 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);
}
}
}
Я не вижу сообщений об ошибках в трассировке стека, он должен быть удален в обзоре реселлера, но это не так. Скриншот