Android Open Source - CheckListView Checklist View Item On Drag Listener






From Project

Back to project page CheckListView.

License

The source code is released under:

Apache License

If you think the Android project CheckListView listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package it.feio.android.checklistview.dragging;
/*  w  w w.  j  a v  a  2s  . c  o  m*/
import android.annotation.TargetApi;
import android.os.Build;
import android.util.Log;
import android.view.DragEvent;
import android.view.View;
import android.view.View.OnDragListener;
import android.view.ViewGroup;
import android.widget.ScrollView;

import it.feio.android.checklistview.App;
import it.feio.android.checklistview.Settings;
import it.feio.android.checklistview.interfaces.Constants;
import it.feio.android.checklistview.models.CheckListViewItem;
import it.feio.android.checklistview.utils.DensityUtil;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class ChecklistViewItemOnDragListener implements OnDragListener {

  private static final int DIRECTION_UP = 0;
  private static final int DIRECTION_DOWN = 1;

  private int dragDirection;
  private float y;
  private Thread scrollerThread;
  private boolean scroll = false;
  private ScrollView scrollView;


  public boolean onDrag(View target, DragEvent event) {
    int action = event.getAction();
    final View dragged = (View) event.getLocalState();
    scrollView = (ScrollView) getScrollableAncestor(dragged);
    switch (action) {
      case DragEvent.ACTION_DRAG_STARTED:
                return actionDragStarted(event, dragged);
      case DragEvent.ACTION_DRAG_ENTERED:
                return actionDragEntered(target, dragged);
      case DragEvent.ACTION_DRAG_EXITED:
                return actionDragExited(target, dragged);
      case DragEvent.ACTION_DRAG_LOCATION:
                return actionDragLocation(target, event);
            case DragEvent.ACTION_DROP:
                return actionDrop(dragged);
      default:
                return true;
    }
  }

    private boolean actionDrop(View dragged) {
        stopScrolling();
        showViewWithDelay(dragged);
        return true;
    }

    private boolean actionDragLocation(View target, DragEvent event) {
        // Control demanded to the container to scroll
        if (checkTag(target, Constants.TAG_LIST)) {
            y = event.getY();
            int scroll = getScroll(scrollView, target);
            if (y - scroll < Constants.SCROLLING_THREESHOLD) {
                dragDirection = DIRECTION_UP;
                startScrolling(target);
            } else if (scrollView.getHeight() - (y - scroll) < Constants.SCROLLING_THREESHOLD) {
                dragDirection = DIRECTION_DOWN;
                startScrolling(target);
            } else {
                stopScrolling();
            }
            return true;
        } else {
            return false;
        }
    }

    private boolean actionDragExited(View target, View dragged) {
        if (checkTag(target, Constants.TAG_LIST)) {
            stopScrolling();
        }
        if (target.equals(dragged.getParent())) {
            showViewWithDelay(dragged);
        }
        return true;
    }

    private boolean actionDragEntered(View target, View dragged) {
        if (targetCanAcceptDrop(dragged, target)) {
            stopScrolling();
            dragged.setVisibility(View.INVISIBLE);
            ViewGroup container = (ViewGroup) dragged.getParent();
            int index = container.indexOfChild(target);
            container.removeView(dragged);
            container.addView(dragged, index);
        }
        return true;
    }

    private boolean actionDragStarted(DragEvent event, View dragged) {
        Log.d(Constants.TAG, "Drag event started");
        dragged.setVisibility(View.INVISIBLE);
        y = event.getY();
        return true;
    }


    private int getScroll(ScrollView scrollView, View target) {
    int scroll = 0;
    scroll += scrollView.getScrollY();
    int sum = 0;
    View child = target;
    ViewGroup parent;
    do {
      parent = (ViewGroup) child.getParent();
      int index = parent.indexOfChild(child);
      for (int i = 0; i < index; i++) {
        sum += parent.getChildAt(i).getHeight();
      }
      child = parent;
    } while (!parent.equals(scrollView));
    return scroll - sum;
  }


  private void startScrolling(View target) {
    if (!scroll) {
      scrollerThread = new Thread(new Scroller(target));
      scroll = true;
      scrollerThread.start();
    }
  }


  private void stopScrolling() {
    if (scroll) {
      scroll = false;
      if (scrollerThread != null && scrollerThread.isAlive()) {
        scrollerThread.interrupt();
      }
    }
  }

  class Scroller implements Runnable {
    View target;

    public Scroller(View target) {
            this.target = target;
    }

    @Override
    public void run() {
      int scrollStep = dragDirection == DIRECTION_UP ? -Constants.SCROLLING_STEP : Constants.SCROLLING_STEP;
      while (scroll) {
        scrollView.smoothScrollBy(0, DensityUtil.dpToPx(scrollStep, scrollView.getContext()));
        try {
          Thread.sleep(Constants.SCROLLING_DELAY);
        } catch (InterruptedException e) {
          Log.d("ChecklistViewItemOnDragListener", "InterruptedException");
        }
      }
    }
  }


  private View getScrollableAncestor(View dragged) {
    View parent = (View) dragged.getParent();
    while (parent != null) {
      if (parent.getClass().isAssignableFrom(ScrollView.class)) {
        break;
      } else {
        parent = (View) parent.getParent();
      }
    }
    return parent;
  }


  private boolean targetCanAcceptDrop(View dragged, View target) {
    boolean canAcceptDrop = false;
    if (checkTag(target, Constants.TAG_ITEM)) {
      CheckListViewItem draggedItem = (CheckListViewItem) dragged;
      CheckListViewItem targetItem = (CheckListViewItem) target;
      if (App.getSettings().getMoveCheckedOnBottom() == Settings.CHECKED_HOLD
          || !(draggedItem.isChecked() ^ targetItem.isChecked())) {
        canAcceptDrop = true;
      }
    }
    return canAcceptDrop;
  }


  private void showViewWithDelay(final View v) {
    v.post(new Runnable() {
      @Override
      public void run() {
        v.setVisibility(View.VISIBLE);
      }
    });
  }


  private boolean checkTag(View view, Object tag) {
    return view.getTag() != null && view.getTag().equals(tag);
  }
}




Java Source Code List

it.feio.android.checklistview.App.java
it.feio.android.checklistview.ChecklistManager.java
it.feio.android.checklistview.Settings.java
it.feio.android.checklistview.demo.MainActivity.java
it.feio.android.checklistview.demo.SettingsActivity.java
it.feio.android.checklistview.dragging.ChecklistViewDragShadowBuilder.java
it.feio.android.checklistview.dragging.ChecklistViewItemOnDragListener.java
it.feio.android.checklistview.dragging.ChecklistViewOnTouchListener.java
it.feio.android.checklistview.exceptions.ViewNotSupportedException.java
it.feio.android.checklistview.interfaces.CheckListChangedListener.java
it.feio.android.checklistview.interfaces.CheckListEventListener.java
it.feio.android.checklistview.interfaces.Constants.java
it.feio.android.checklistview.interfaces.EditTextEventListener.java
it.feio.android.checklistview.models.CheckListViewItem.java
it.feio.android.checklistview.models.CheckListView.java
it.feio.android.checklistview.models.EditTextMultiLineNoEnter.java
it.feio.android.checklistview.utils.AlphaManager.java
it.feio.android.checklistview.utils.DensityUtil.java