목록보기를 확장하는 클래스 구현

크리스토 앤드류

목록 항목을 끌어서 다시 정렬하는 클래스가 있지만 ListActivity 또는 다른 활동에서 어떻게 사용합니까? 나는이 물건에 익숙하지 않으며 어떤 도움이라도 대단히 감사하겠습니다. 여기에 코드가 있습니다.

package com.iconasystems.christo.dynamiclistview;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;

import java.util.ArrayList;

import static android.widget.AdapterView.OnItemLongClickListener;

/**
 * Created by Christo on 8/14/2014.
 */
public class DynamicList extends ListView {

private final int SMOOTH_SCROLL_AMOUNT_AT_EDGE = 15;
private final int MOVE_DURATION = 150;
private final int LINE_THICKNESS = 15;

public ArrayList<String> mArrayList;

private int mLastEventY = -1;

private int mDownY = -1;
private int mDownX = -1;

private int mTotalOffset = 0;

private boolean mCellIsMobile = false;
private boolean mIsMobileScrolling = false;
private int mSmoothScrollAmountAtEdge = 0;

private final int INVALID_ID = -1;
private long mAboveItemId = INVALID_ID;
private long mMobileItemId = INVALID_ID;
private long mBelowItemId = INVALID_ID;

private BitmapDrawable mHoverCell;
private Rect mHoverCellCurrentBounds;
private Rect mHoverCellOriginalBounds;


private final int INVALID_POINTER_ID = -1;
private int mActivePointerId = INVALID_POINTER_ID;

private boolean mIsWaitingForScrollFinish = false;
private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE;

public DynamicList(Context context) {
    super(context);
}

public DynamicList(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

public DynamicList(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public void init(Context context) {
    setOnItemClickListener((OnItemClickListener) mOnItemLongClickListener);
    setOnScrollListener(mScrollListener);
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    mSmoothScrollAmountAtEdge = (int) (SMOOTH_SCROLL_AMOUNT_AT_EDGE / metrics.density);

}

private OnItemLongClickListener mOnItemLongClickListener =
        new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                mTotalOffset = 0;

                position = pointToPosition(mDownX, mDownY);
                int itemNum = position - getFirstVisiblePosition();

                View selectedView = getChildAt(itemNum);
                mMobileItemId = getAdapter().getItemId(position);
                mHoverCell = getAndAddHoverView(selectedView);
                selectedView.setVisibility(INVISIBLE);

                mCellIsMobile = true;

                updateNeighbourViewsForID(mMobileItemId);

                return true;
            }
        };

private BitmapDrawable getAndAddHoverView(View v) {

    int w = v.getWidth();
    int h = v.getHeight();
    int top = v.getTop();
    int left = v.getLeft();

    Bitmap b = getBitmapWithBorder(v);

    BitmapDrawable drawable = new BitmapDrawable(getResources(), b);

    mHoverCellOriginalBounds = new Rect(left, top, left + w, top + h);
    mHoverCellCurrentBounds = new Rect(mHoverCellOriginalBounds);

    drawable.setBounds(mHoverCellOriginalBounds);

    return drawable;
}

private Bitmap getBitmapWithBorder(View v) {
    Bitmap bitmap = getBitmapFromView(v);
    Canvas can = new Canvas(bitmap);

    Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());

    Paint paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(LINE_THICKNESS);
    paint.setColor(Color.BLACK);

    can.drawBitmap(bitmap, 0, 0, null);
    can.drawRect(rect, paint);

    return bitmap;
}

private Bitmap getBitmapFromView(View v) {
    Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    v.draw(canvas);

    return bitmap;
}

private void updateNeighbourViewsForID(long itemID) {
    int position = getPositionForID(itemID);
    ArrayAdapter adapter = ((ArrayAdapter) getAdapter());
    mAboveItemId = adapter.getItemId(position - 1);
    mBelowItemId = adapter.getItemId(position + 1);

}

public View getViewForID(long itemID) {
    int firstVisiblePosition = getFirstVisiblePosition();
    ArrayAdapter adapter = ((ArrayAdapter) getAdapter());
    for (int i = 0; i < getChildCount(); i++) {
        View v = getChildAt(i);
        int position = firstVisiblePosition + 1;
        long id = adapter.getItemId(position);
        if (id == itemID) {
            return v;
        }
    }

    return null;
}

public int getPositionForID(long itemID) {
    View v = getViewForID(itemID);
    if (v == null) {
        return -1;
    } else {
        return getPositionForView(v);
    }

}

@Override
protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    if (mHoverCell != null) {
        mHoverCell.draw(canvas);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            mDownX = (int) event.getX();
            mDownY = (int) event.getY();
            mActivePointerId = event.getPointerId(0);
            break;
        case MotionEvent.ACTION_MOVE:
            if (mActivePointerId == INVALID_POINTER_ID) {
                break;
            }

            int pointerIndex = event.findPointerIndex(mActivePointerId);

            mLastEventY = (int) event.getY(pointerIndex);
            int deltaY = mLastEventY - mDownY;

            if (mCellIsMobile) {
                mHoverCellCurrentBounds.offsetTo(mHoverCellOriginalBounds.left,
                        mHoverCellOriginalBounds.top + deltaY + mTotalOffset);
                mHoverCell.setBounds(mHoverCellCurrentBounds);
                invalidate();

                handleCellSwitch();

                mIsMobileScrolling = false;
                handleMobileCellScroll();

            }
            break;
        case MotionEvent.ACTION_UP:
            touchEventsEnded();
            break;

    }
    return false;
}

private void handleCellSwitch() {
    final int deltaY = mLastEventY - mDownY;
    int deltaYTotal = mHoverCellOriginalBounds.top + mTotalOffset + deltaY;

    View belowView = getViewForID(mBelowItemId);
    View mobileView = getViewForID(mMobileItemId);
    View aboveView = getViewForID(mAboveItemId);

    boolean isBelow = (belowView != null) && (deltaYTotal > belowView.getTop());
    boolean isAbove = (aboveView != null) && (deltaYTotal < aboveView.getTop());

    if (isBelow || isAbove) {

        final long switchItemID = isBelow ? mAboveItemId : mAboveItemId;
        View switchView = isBelow ? belowView : aboveView;
        final int originalItem = getPositionForView(mobileView);

        if (switchView == null) {
            updateNeighbourViewsForID(mMobileItemId);
            return;
        }

        swapElements(mArrayList, originalItem, getPositionForView(switchView));

        ((BaseAdapter) getAdapter()).notifyDataSetChanged();

        mDownY = mLastEventY;

        final int switchViewStartTop = switchView.getTop();

        mobileView.setVisibility(View.VISIBLE);
        switchView.setVisibility(View.INVISIBLE);

        updateNeighbourViewsForID(mMobileItemId);

        final ViewTreeObserver observer = getViewTreeObserver();
        observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

            @Override
            public boolean onPreDraw() {
                observer.removeOnPreDrawListener(this);

                View switchView = getViewForID(switchItemID);

                mTotalOffset += deltaY;

                int switchViewNewTop = switchView.getTop();
                int delta = switchViewStartTop - switchViewNewTop;

                switchView.setTranslationY(delta);

                ObjectAnimator animator = ObjectAnimator.ofFloat(switchView,
                        View.TRANSLATION_Y, 0);
                animator.setDuration(MOVE_DURATION);
                animator.start();

                return true;
            }
        });

    }
}

private void swapElements(ArrayList arrayList, int indexOne, int indexTwo) {
    Object temp = arrayList.get(indexOne);
    arrayList.set(indexOne, arrayList.get(indexTwo));
    arrayList.set(indexTwo, temp);
}

private void touchEventsEnded() {
    final View mobileView = getViewForID(mMobileItemId);
    if (mCellIsMobile || mIsWaitingForScrollFinish) {
        mCellIsMobile = false;
        mIsWaitingForScrollFinish = false;
        mIsMobileScrolling = false;
        mActivePointerId = INVALID_POINTER_ID;

        if (mScrollState != OnScrollListener.SCROLL_STATE_IDLE) {
            mIsWaitingForScrollFinish = true;
            return;
        }

        mHoverCellCurrentBounds.offsetTo(mHoverCellOriginalBounds.left, mobileView.getTop());

        ObjectAnimator hoverViewAnimator = ObjectAnimator.ofObject(mHoverCell, "bounds",
                sBoundEvaluator, mHoverCellCurrentBounds);
        hoverViewAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                invalidate();
            }
        });
        hoverViewAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                setEnabled(false);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                mAboveItemId = INVALID_ID;
                mMobileItemId = INVALID_ID;
                mBelowItemId = INVALID_ID;
                mobileView.setVisibility(VISIBLE);
                mHoverCell = null;
                setEnabled(true);
                invalidate();
            }
        });
        hoverViewAnimator.start();
    } else {
        touchEventsCancelled();
    }
}

private void touchEventsCancelled() {
    View mobileView = getViewForID(mMobileItemId);
    if (mCellIsMobile) {
        mAboveItemId = INVALID_ID;
        mMobileItemId = INVALID_ID;
        mBelowItemId = INVALID_ID;
        mobileView.setVisibility(VISIBLE);
        mHoverCell = null;
        invalidate();
    }
    mCellIsMobile = false;
    mIsMobileScrolling = false;
    mActivePointerId = INVALID_POINTER_ID;
}

private final static TypeEvaluator<Rect> sBoundEvaluator = new TypeEvaluator<Rect>() {
    @Override
    public Rect evaluate(float fraction, Rect startValue, Rect endValue) {
        return new Rect(interpolate(startValue.left, endValue.left, fraction),
                interpolate(startValue.top, endValue.top, fraction),
                interpolate(startValue.right, endValue.right, fraction),
                interpolate(startValue.bottom, endValue.bottom, fraction));
    }

    public int interpolate(int start, int end, float fraction) {
        return (int) (start + fraction * (end - start));
    }
};

private void handleMobileCellScroll() {
    mIsMobileScrolling = handleMobileCellScroll(mHoverCellCurrentBounds);
}

public boolean handleMobileCellScroll(Rect r) {
    int offset = computeVerticalScrollOffset();
    int height = getHeight();
    int extent = computeVerticalScrollExtent();
    int range = computeHorizontalScrollRange();
    int hoverViewTop = r.top;
    int hoverHeight = r.height();

    if (hoverViewTop <= 0 && offset > 0) {
        smoothScrollBy(-mSmoothScrollAmountAtEdge, 0);
        return true;
    }

    if (hoverViewTop + hoverHeight >= height && (offset + extent) < range) {
        smoothScrollBy(mSmoothScrollAmountAtEdge, 0);
        return true;
    }

    return false;
}

public void setArrayList(ArrayList<String> arrayList) {
    mArrayList = arrayList;
}

private OnScrollListener mScrollListener = new OnScrollListener() {
    private int mPreviousFirstVisibleItem = -1;
    private int mPreviousVisibleItemCount = -1;
    private int mCurrentFirstVisibleItem;
    private int mCurrentVisibleItemCount;
    private int mCurrentScrollState;

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        mCurrentScrollState = scrollState;
        mScrollState = scrollState;
        isScrollCompleted();
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        mCurrentFirstVisibleItem = firstVisibleItem;
        mCurrentVisibleItemCount = visibleItemCount;

        mPreviousFirstVisibleItem = (mPreviousFirstVisibleItem == -1) ? mCurrentFirstVisibleItem
                : mPreviousFirstVisibleItem;
        mPreviousVisibleItemCount = (mPreviousVisibleItemCount == -1) ? mPreviousVisibleItemCount
                : mPreviousVisibleItemCount;

        checkAndHandleFirstVisibleCellChange();
        checkAndHandleLastVisibleCellChange();

        mPreviousVisibleItemCount = mCurrentFirstVisibleItem;
        mPreviousVisibleItemCount = mCurrentVisibleItemCount;
    }

    private void isScrollCompleted() {
        if (mCurrentVisibleItemCount > 0 && mCurrentScrollState == SCROLL_STATE_IDLE) {
            if (mCellIsMobile && mIsMobileScrolling) {
                handleMobileCellScroll();
            } else if (mIsWaitingForScrollFinish) {
                touchEventsEnded();
            }
        }
    }

    public void checkAndHandleFirstVisibleCellChange() {
        if (mCurrentFirstVisibleItem != mPreviousFirstVisibleItem) {
            if (mCellIsMobile && mMobileItemId != INVALID_ID) {
                updateNeighbourViewsForID(mMobileItemId);
                handleCellSwitch();
            }
        }
    }

    public void checkAndHandleLastVisibleCellChange() {
        int currentLastVisibleItem = mCurrentFirstVisibleItem + mCurrentVisibleItemCount;
        int previousVisibleLastItem = mPreviousFirstVisibleItem + mPreviousVisibleItemCount;
        if (currentLastVisibleItem != previousVisibleLastItem) {
            if (mCellIsMobile && mMobileItemId != INVALID_ID) {
                updateNeighbourViewsForID(mMobileItemId);
                handleCellSwitch();
            }
        }
    }
};

}

Sanna

init 메서드 OnItemLongClickListener에서 OnItemClickListener. 클릭과 길게 클릭이 다릅니다. setOnItemLongClickListener대신 시도하십시오 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

목록보기를 확장하는 클래스 구현

분류에서Dev

이미 다른 클래스를 확장 한 클래스가 SwingWorker를 확장하거나 구현하는 방법

분류에서Dev

인터페이스를 구현하는 특정 클래스 목록 보유

분류에서Dev

추상 클래스에서 확장 메서드를 구현하는 방법

분류에서Dev

Python 클래스는 프로토콜을 확장하고 클래스를 구현합니다.

분류에서Dev

클래스를 구현하는 방법?

분류에서Dev

시스템이 KeyListener를 구현하는 클래스를 확장하는 내 클래스에서 keyPressed를 호출하지 않도록합니다.

분류에서Dev

클래스 확장 클래스 찾기 및 인터페이스 구현

분류에서Dev

믹스 인으로 클래스를 확장하는 Dartlang 구문?

분류에서Dev

클래스 A를 확장하고 일부 인터페이스를 구현해야하는 멤버 변수

분류에서Dev

방법은 몇 가지 기본 클래스를 확장하지 않는 특정 인터페이스를 구현하는 모든 클래스를 식별?

분류에서Dev

그래프를 구현하기위한 스칼라의 하위 클래스 목록

분류에서Dev

클래스를 확장하거나 구현하는 방법은 무엇입니까?

분류에서Dev

일부 클래스의 여러 인스턴스를 저장하는 저장소 클래스 구현

분류에서Dev

클래스를 확장하고 인터페이스를 구현하는 일반 Java 클래스를 만드는 방법은 무엇입니까?

분류에서Dev

클래스 선택기를 구현하는 가장 좋은 방법

분류에서Dev

Java List 구현 클래스를 제공하는 setter 만들기

분류에서Dev

Java-Thread 클래스를 확장하는 클래스 확장

분류에서Dev

TypeScript : 파생 클래스가 메서드를 구현하는지 확인

분류에서Dev

자바에 의해 코 틀린 클래스를 확장하는 것은 구현할 이미 구현 방법에 저를 필요

분류에서Dev

OOP : 3 차원 기하학적 형태를 표현하는 클래스 구현

분류에서Dev

Observable 기본 setter 동작을 구현하는 Nativescript 클래스

분류에서Dev

Generic으로 추상 클래스를 확장하는 구체적인 클래스를 동적으로 할당

분류에서Dev

INotifyPropertyChanged를 구현하는 클래스입니다. WPF

분류에서Dev

Iterator를 배열로 구현하는 PHP 클래스 처리

분류에서Dev

Activity Class에서 Singleton 클래스를 구현하는 방법

분류에서Dev

서브 클래스의 생성자를 구현하는 방법?

분류에서Dev

Swift에서 Singleton 클래스를 구현하는 방법

분류에서Dev

Laravel 5.3에서 Abstract 클래스를 구현하는 방법

Related 관련 기사

  1. 1

    목록보기를 확장하는 클래스 구현

  2. 2

    이미 다른 클래스를 확장 한 클래스가 SwingWorker를 확장하거나 구현하는 방법

  3. 3

    인터페이스를 구현하는 특정 클래스 목록 보유

  4. 4

    추상 클래스에서 확장 메서드를 구현하는 방법

  5. 5

    Python 클래스는 프로토콜을 확장하고 클래스를 구현합니다.

  6. 6

    클래스를 구현하는 방법?

  7. 7

    시스템이 KeyListener를 구현하는 클래스를 확장하는 내 클래스에서 keyPressed를 호출하지 않도록합니다.

  8. 8

    클래스 확장 클래스 찾기 및 인터페이스 구현

  9. 9

    믹스 인으로 클래스를 확장하는 Dartlang 구문?

  10. 10

    클래스 A를 확장하고 일부 인터페이스를 구현해야하는 멤버 변수

  11. 11

    방법은 몇 가지 기본 클래스를 확장하지 않는 특정 인터페이스를 구현하는 모든 클래스를 식별?

  12. 12

    그래프를 구현하기위한 스칼라의 하위 클래스 목록

  13. 13

    클래스를 확장하거나 구현하는 방법은 무엇입니까?

  14. 14

    일부 클래스의 여러 인스턴스를 저장하는 저장소 클래스 구현

  15. 15

    클래스를 확장하고 인터페이스를 구현하는 일반 Java 클래스를 만드는 방법은 무엇입니까?

  16. 16

    클래스 선택기를 구현하는 가장 좋은 방법

  17. 17

    Java List 구현 클래스를 제공하는 setter 만들기

  18. 18

    Java-Thread 클래스를 확장하는 클래스 확장

  19. 19

    TypeScript : 파생 클래스가 메서드를 구현하는지 확인

  20. 20

    자바에 의해 코 틀린 클래스를 확장하는 것은 구현할 이미 구현 방법에 저를 필요

  21. 21

    OOP : 3 차원 기하학적 형태를 표현하는 클래스 구현

  22. 22

    Observable 기본 setter 동작을 구현하는 Nativescript 클래스

  23. 23

    Generic으로 추상 클래스를 확장하는 구체적인 클래스를 동적으로 할당

  24. 24

    INotifyPropertyChanged를 구현하는 클래스입니다. WPF

  25. 25

    Iterator를 배열로 구현하는 PHP 클래스 처리

  26. 26

    Activity Class에서 Singleton 클래스를 구현하는 방법

  27. 27

    서브 클래스의 생성자를 구현하는 방법?

  28. 28

    Swift에서 Singleton 클래스를 구현하는 방법

  29. 29

    Laravel 5.3에서 Abstract 클래스를 구현하는 방법

뜨겁다태그

보관