2016-07-09 25 views
1

Ich habe diesen Code in meinem adapter für RecyclerView:Funktion genannt zu werden 2 mal in 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; 
    } 
}); 

Also, was ich tun möchte, ist: sobald die langen Klick beginnt, möchte ich eine Methode aufrufen Verwischen Sie den Bildschirm mit Ausnahme des Bildes, bei dem ein langer Klick auftritt, und diese Unschärfe (Änderung des Alphas des Hintergrunds) erfolgt in 400 ms. Das Problem besteht darin, dass die blurBackground()-Methode zweimal aufgerufen wird. Wenn ich also die Unschärfe in onActivityResult entferne, entferne ich nur die letzte hinzugefügte Ebene, während eine andere Ebene der Unschärfe vorhanden ist, weil die Methode zweimal aufgerufen wird. Ich erwarte, dass die Methode blurBackground() nur einmal aufgerufen wird.

Was ist die Ursache für dieses Verhalten und wie kann es behoben werden?

Hier sind andere Methoden:

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

Stehen Sie Ihre Zuhörer in der getView() -Methode in Ihrem Adapter Registrierung? Da Sie RecyclerView verwenden, ruft der Algorithmus sie möglicherweise zweimal auf. – Lazai

+0

@Lazai aber es würde nicht jedes Mal aufgerufen werden, wenn 'getView()' aufgerufen wird. Es wird nur aufgerufen, wenn Sie diese Ansicht berühren. –

Antwort

1

, wenn Ihr Problem ist nur, dass blurBackground zweimal aufgerufen wird beign Sie eine Flagge nur erhöhen kann!

Boolean isBlurred = false; 

dann in blurBackground

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

    ... 
    isBlurred = true; 
    } 
} 
+0

ya, das ist ein Weg, aber ich bin mehr daran interessiert, warum es so ist. –