2013-02-01 35 views
5

我做了一個拖放GridView。除了第一次拖放之外,一切都很完美。我找不到它第一次發生的原因。第一次丟失ImageView來源我拖放了我的GridView

我第一次將一個項目拖到gridview中的其他項目上時,這些項目的imageview源將會丟失。當我放棄時,來源將被固定。之後,每件事情都會正常工作。任何想法如何我可以解決這個或奇怪行爲的原因。歡迎每一個幫助。

這裏是我的touchListener至極將處理拖放:

mGridView.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       GridView parent = (GridView) v; 

       int x = (int) event.getX(); 
       int y = (int) event.getY(); 

       int position = parent.pointToPosition(x, y); 
       if (position > AdapterView.INVALID_POSITION) { 

        int count = parent.getChildCount(); 
        for (int i = 0; i < count; i++) { 
         View curr = parent.getChildAt(i); 
         curr.setOnDragListener(new View.OnDragListener() { 

          @Override 
          public boolean onDrag(View v, DragEvent event) { 

           boolean result = true; 
           int action = event.getAction(); 
           switch (action) { 
           case DragEvent.ACTION_DRAG_STARTED: 
            break; 
           case DragEvent.ACTION_DRAG_LOCATION: 
            break; 
           case DragEvent.ACTION_DRAG_ENTERED:  
            setBlueFilterOnImageView((ImageView) v, getActivity()); 
            break; 
           case DragEvent.ACTION_DRAG_EXITED: 
            clearColorFilterOnImageView((ImageView) v); 
            break; 
           case DragEvent.ACTION_DROP: 

            if (event.getLocalState() == v) { 
             result = false; 
            } else { 

             View droped = (View) event.getLocalState(); 

             View target = v; 

             app.myProfile().removeProfilePhotoAtIndex(((DragGridItemHolder) droped.getTag()).position); 
             app.myProfile().insertProfilePhoto(((DragGridItemHolder) droped.getTag()).id, ((DragGridItemHolder) target.getTag()).position); 


             mAdapter.notifyDataSetChanged(); 

            } 
            break; 
           case DragEvent.ACTION_DRAG_ENDED: 
            clearColorFilterOnImageView((ImageView) v);  
            break; 
           default: 
            result = false; 
            break; 
           } 
           return result; 
          } 
         }); 
        } 

        int relativePosition = position - parent.getFirstVisiblePosition(); 


        View target = (View) parent.getChildAt(relativePosition); 

        DragGridItemHolder holder = (DragGridItemHolder) target.getTag(); 
        String text = holder.id; 
        ClipData data = ClipData.newPlainText("DragData", text); 
        target.startDrag(data, new View.DragShadowBuilder(target), target, 0); 
       } 
      } 
      return false; 
     } 
    }); 

編輯

public static void setBlueFilterOnImageView(ImageView imageView, Context context){ 
    PorterDuffColorFilter blueFilter = new PorterDuffColorFilter(
      context.getResources().getColor(R.color.grid_state_focused), 
      PorterDuff.Mode.SRC_ATOP); 
    imageView.setColorFilter(blueFilter); 
    imageView.setBackgroundColor(context.getResources().getColor(
      R.color.grid_state_pressed)); 
} 
+0

你是什麼意思,這兩個聲明:「物品的imageview來源丟失」和「當我放下它的來源將是固定「 –

+0

意見是圖像。當我將圖像視圖拖到其他一些圖像視圖上時,這些圖像視圖將停止顯示圖像(我已將圖像設置爲圖像視圖的來源)。儘快我會放棄imageview,gridview適配器上的notifyDataSetChanged()將被調用,並且所有圖片都會再次顯示。之後,一切正常,圖片不會消失。對不起,我的英語不好。 – Luciano

+0

你在做什麼'setBlueFilterOnImageView'? – Luksprog

回答

0

我finnaly找到了解決辦法。所以問題是當我在DragEvent.ACTION_DRAG_ENTERED中設置一個彩色濾鏡時,ImageView源碼將會消失。爲了避免這種情況,我設置一個彩色濾鏡時重置了源。不是一個很乾淨的解決方案,但它對我來說很有幫助Thnx的所有幫助

1

我發現this相關型號到您的查詢可能是它會幫助你。它很難理解你的長代碼,所以試圖從這個鏈接管理。

可能問題是mGridView.setOnTouchListener(new View.OnTouchListener() ...一次嘗試做這樣mGridView.setOnTouchListener(new OnTouchListener() ...

0

我覺得有幾個問題,在您的代碼:

一個。您的onTouch方法始終返回false,這通常意味着偵聽器尚未使用該事件。所以你應該在

target.startDrag(data, new View.DragShadowBuilder(target), target, 0); 

b。您將onDragListener註冊放入onTouch事件的處理方法中,我認爲這可能是導致此問題的主要原因。當您拖放拖動的項目時,onDragListener可能尚未註冊。由於您的監聽器註冊不依賴於源視圖,因此您可以直接註冊onDragListener。並使代碼看起來像這樣:

mGridView.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View view, MotionEvent event) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ClipData data = ClipData.newPlainText("", ""); 
      DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
      return true; 
     } else { 
      return false; 
     } 
    } 

}; 

for(View view : ...){ 
    view.setOnDragListener(new View.OnDragListener() { 
     //put your implementation here 
    } 
} 
+0

THnx爲你的幫助..我現在看到我的代碼如上所示,但仍然同樣的行爲.. – Luciano