2016-07-09 3 views
1

J'ai ce code dans mon adapter pour RecyclerView:Fonction obtenir appelé 2 fois dans OnLongClickListener

holder.image.setOnLongClickListener(new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(View v) { 
    int[] loc = new int[2]; 
    holder.image.getLocationInWindow(loc); 
    ((FeedFragment) fragment).blurBackground(getBitmapFromView(holder.image), loc[0], loc[1]); 
    Toast.makeText(context.getApplicationContext(), "Long press started", Toast.LENGTH_SHORT).show(); 
    isLongPressed = true; 
    return true; 
    } 
}); 

holder.image.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    v.onTouchEvent(event); 
    // We're only interested in when the button is released. 
    if (event.getAction() == MotionEvent.ACTION_UP) { 
     // We're only interested in anything if our speak button is currently pressed. 
     if (isLongPressed) { 
     // ((FeedFragment) fragment).removeBlur(); 
     ((FeedFragment) fragment).showAllGalleries(String.valueOf(photo.getPk())); 
     Toast.makeText(context.getApplicationContext(), "Long press ended", Toast.LENGTH_SHORT).show(); 
     // Do something when the button is released. 
     isLongPressed = false; 
     } 
    } 
    return false; 
    } 
}); 

Donc ce que je veux faire est: dès que les longs départs de clic, je veux appeler une méthode pour brouiller l'écran sauf l'image où un long clic se produit et ce flou (alpha changeant d'arrière plan) se produit en 400 ms. La méthode blurBackground() est appelée deux fois. Donc, quand je supprime le flou dans onActivityResult, je supprime seulement la dernière couche ajoutée, alors qu'une autre couche de flou est présente parce que la méthode est appelée deux fois. Je m'attends à ce que la méthode blurBackground() soit appelée une seule fois.

Quelle est la cause de ce problème et comment peut-il être réparé?

Voici d'autres méthodes:

public void blurBackground(Bitmap bitmapFromView, int left, int top) { 
    LogUtil.i(TAG, "blurBackground called"); 

    int statusBarHeight = (int) Math.ceil(25 * getActivity().getResources().getDisplayMetrics().density); 

    RelativeLayout overlay = new RelativeLayout(getActivity()); 
    ID_OVERLAY = ViewIDGenerator.generateViewId(); 
    LogUtil.i(TAG, "ID = " + ID_OVERLAY); 
    overlay.setId(ID_OVERLAY); 
    overlay.setBackgroundColor(Color.parseColor("#000000")); 
    RelativeLayout.LayoutParams overlayParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); 
    overlay.setLayoutParams(overlayParams); 

    ImageView snapshot = new ImageView(getActivity()); 
    snapshot.setImageBitmap(bitmapFromView); 
    RelativeLayout.LayoutParams snapshotParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    snapshotParams.setMargins(left, top-statusBarHeight, 0, 0); 
    snapshot.setLayoutParams(snapshotParams); 

    overlay.addView(snapshot); 
    container.addView(overlay); 

    AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 0.7f); 
    alphaAnimation.setDuration(400); 
    alphaAnimation.setFillAfter(true); 
    overlay.startAnimation(alphaAnimation); 
} 

public void removeBlur() { 
    LogUtil.i(TAG, "removeBlur called"); 
    LogUtil.i(TAG, "ID = " + ID_OVERLAY); 
    View namebar = container.findViewById(ID_OVERLAY); 
    ((ViewGroup) namebar.getParent()).removeView(namebar); 
} 
+0

Êtes-vous l'enregistrement de vos auditeurs dans la méthode getView() dans votre adaptateur? Puisque vous utilisez RecyclerView, l'algorithme peut l'appeler deux fois. – Lazai

+0

@Lazai mais il ne serait pas appelé à chaque fois que 'getView()' est appelé. il ne sera appelé que lorsque vous touchez cette vue. –

Répondre

1

si votre problème est seulement que blurBackground est beign appelé deux fois, il vous suffit de lever un drapeau!

Boolean isBlurred = false; 

puis dans blurBackground

public void blurBackground(Bitmap bitmapFromView, int left, int top) { 
    if (!isBlurred) 
    { 
    LogUtil.i(TAG, "blurBackground called"); 

    ... 
    isBlurred = true; 
    } 
} 
+0

ya, c'est un moyen, mais je suis plus intéressé par pourquoi est-ce le cas. –