2016-04-29 156 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次。