2016-04-29 153 views
0

我正在使用自定義行和自定義適配器進行列表視圖。我已將OnTouchListener和OnDragListener附加到列表視圖中的每個視圖。Android OnDragListener - ACTION_DRAG_ENDED多次觸發

我更新的基礎數據如果下拉結果爲真(被拖動的視圖列表視圖的範圍內下降)

的ACTION_DRAG_ENDED情況下觸發4次,有效和無效滴,但我不知道爲什麼。有人可以告訴我爲什麼會發生這種情況嗎?

我的聽衆代碼如下。

@Override 
     public View getView(final int position, View convertView, final ViewGroup parent) { 

      LayoutInflater inflater = LayoutInflater.from(getApplicationContext()); 
      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.lv_item_stage, parent, false); 
      } 

      //setting text/images for the view 

      convertView.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View view, MotionEvent motionEvent) { 
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
         START_POS = position; 

         ClipData data = ClipData.newPlainText("", ""); 
         View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
         view.startDrag(data, shadowBuilder, view, 0); 
         view.setVisibility(View.GONE); 
         return true; 
        } else { 
         return false; 
        } 
       } 
      }); 

      convertView.setOnDragListener(new View.OnDragListener() { 
       @Override 
       public boolean onDrag(final View v, DragEvent event) { 
        switch (event.getAction()) { 
         case DragEvent.ACTION_DRAG_ENTERED: 
          AbsListView.LayoutParams params = new AbsListView.LayoutParams(v.getWidth(), v.getHeight()*2); 

          if(position > START_POS){ 
           //view dragged downwards 
           moveData(START_POS, position); 
           ((LinearLayout) v).setGravity(Gravity.TOP); 
          } 
          else{ 
           //view dragged upwards 
           moveData(START_POS, position); 
           ((LinearLayout) v).setGravity(Gravity.BOTTOM); 
          } 

          v.setLayoutParams(params); 

          START_POS = position; 
          break; 

         case DragEvent.ACTION_DRAG_EXITED: 
          //go straight into ACTION_DROP case (resize view to original size) 
         case DragEvent.ACTION_DROP: 
          v.setLayoutParams(new AbsListView.LayoutParams(v.getWidth(), v.getHeight()/2)); 
          break; 
         case DragEvent.ACTION_DRAG_ENDED: 
          //update list view if drop valid (inside list view) 
          if (event.getResult()){ 
           Log.d("listView", "result = TRUE"); 
           updateListView(tempData); 
          } 
          else{ 
           Log.d("listView", "result = FALSE"); 
          } 

          final View droppedView = (View) event.getLocalState(); 
          droppedView.post(new Runnable() { 
           @Override 
           public void run() { 
            droppedView.setVisibility(View.VISIBLE); 
           } 
          }); 
          break; 
         default: 
          break; 
        } 
        return true; 
       } 
      }); 
      return convertView; 
     } 

回答

0

ACTION_DRAG_ENDED將針對您附加了拖動偵聽器的每個視圖觸發一次。 ACTION_DRAG_STARTED也是如此。因此,如果您將onDragListener附加到4個視圖,則這些事件將觸發4次。