J'ai une activité avec plein écran RecyclerView pour charger des images. L'utilisateur peut glisser vers la gauche-droite pour voir l'élément suivant (atteint ceci par LinearSnapHelper
) Sur l'image, il a une barre d'action flottante dont l'action est de télécharger l'image actuellement visible.Récupérer un objet visible dans RecyclerView
Le problème est lorsque je clique sur le FAB, au lieu de télécharger l'image actuelle, il télécharge l'élément suivant. Parce que onBindViewHolder
est exécuté à l'avance pour l'élément suivant et précédent. Le problème ne se produit pas lorsque FAB fait partie de la disposition des éléments, mais dans ce cas Fab fait partie de la mise en page de l'activité.
adapteur
public class FullWallAdapter extends RecyclerView.Adapter<FullscreenViewHolder> {
private ArrayList<String> mWallKeys;
private OnFullSetupViewListener mOnFullSetupViewListener;
public FullWallAdapter(ArrayList<String> wallKeys, OnFullSetupViewListener listener) {
this.mWallKeys = wallKeys;
this.mOnFullSetupViewListener = listener;
}
@Override
public FullscreenViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fullscreen_wallpaper_preview, parent, false);
return new FullscreenViewHolder(itemView);
}
@Override
public void onBindViewHolder(final FullscreenViewHolder holder, int position) {
ValueEventListener wallListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ImageModel image = dataSnapshot.getValue(ImageModel.class);
mOnFullSetupViewListener.onSetupView(holder, image, holder.getAdapterPosition(), dataSnapshot.getKey());
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e("WallAdapter", "Error occurred: " + databaseError.getMessage());
}
};
DatabaseReference ref = FireUtils.getWallpapersRef().child(mWallKeys.get(position));
ref.addValueEventListener(wallListener);
holder.mWallRef = ref;
holder.mWallListener = wallListener;
}
@Override
public int getItemCount() {
return mWallKeys.size();
}
@Override
public void onViewRecycled(FullscreenViewHolder holder) {
super.onViewRecycled(holder);
if (holder.mWallListener != null)
holder.mWallRef.removeEventListener(holder.mWallListener);
}
public interface OnFullSetupViewListener {
void onSetupView(FullscreenViewHolder holder, ImageModel image, int position, String wallKey);
}
}
Dans activité-
FullWallAdapter adapter = new FullWallAdapter(wallKeys, new FullWallAdapter.OnFullSetupViewListener() {
@Override
public void onSetupView(final FullscreenViewHolder holder, final ImageModel image,
int position, final String wallKey) {
holder.setImageView(image);
downloadFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
incrementDownload(wallKey, image);
String params;
params = wallpaper.getPhotoJson();
fetchSave(params);
}
});
}
});