2017-10-06 6 views
0

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); 

       } 
      }); 
     } 
    }); 

Répondre

0

je ne peux penser à la solution comme suit. Déclencher onClickListener à chaque fois que l'utilisateur défile.

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
      currentPosition = llm.findFirstVisibleItemPosition(); 
      downloadFab.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
       ... 
       } 
     } 
}