StickyListHeaders icon indicating copy to clipboard operation
StickyListHeaders copied to clipboard

Can add supporting CoordinatorLayout?

Open xu6148152 opened this issue 9 years ago • 5 comments

thank you, I think it's very awesome.

xu6148152 avatar Jul 03 '15 03:07 xu6148152

+1

baolongnt avatar Oct 21 '15 21:10 baolongnt

+1

lsjwzh avatar Oct 25 '15 05:10 lsjwzh

This is working code,

import android.content.Context;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v4.view.NestedScrollingChild;
import android.support.v4.view.NestedScrollingChildHelper;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;

import se.emilsjolander.stickylistheaders.StickyListHeadersListView;

/**
 * Created by akash.kava on 13-11-2015.
 */
public class CoordinatorStickyList
        extends StickyListHeadersListView
        implements NestedScrollingChild, GestureDetector.OnGestureListener {

    private final NestedScrollingChildHelper mNestedScrollingChildHelper;
    private GestureDetectorCompat mDetector;

    public CoordinatorStickyList(Context context) {
        this(context, null);
    }

    public CoordinatorStickyList(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CoordinatorStickyList(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //mNestedScrollingChildHelper = new NestedScrollingChildHelper(this);
        mDetector = new GestureDetectorCompat(context, this);
        //setNestedScrollingEnabled(true);

        /*this.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return onTouchEvent(event);
            }
        });*/

        mNestedScrollingChildHelper = new NestedScrollingChildHelper(getWrappedList());
        if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.Kitkat){
            mNestedScrollingChildHelper.setNestedScrollingEnabled(true);
        }else{
            getWrappedList().setNestedScrollingEnabled(true);
        }
    }

    @Override
    public void setNestedScrollingEnabled(boolean enabled) {
        mNestedScrollingChildHelper.setNestedScrollingEnabled(true);
    }

    @Override
    public boolean isNestedScrollingEnabled() {
        return mNestedScrollingChildHelper.isNestedScrollingEnabled();
    }

    @Override
    public boolean startNestedScroll(int axes) {
        return mNestedScrollingChildHelper.startNestedScroll(axes);
    }

    @Override
    public void stopNestedScroll() {
        mNestedScrollingChildHelper.stopNestedScroll();
    }

    @Override
    public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
        return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow);
    }

    @Override
    public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
        return mNestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
    }

    @Override
    public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
        return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
    }

    @Override
    public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
        return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY);
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        mNestedScrollingChildHelper.onDetachedFromWindow();
    }

    @Override
    public boolean hasNestedScrollingParent() {
        return mNestedScrollingChildHelper.hasNestedScrollingParent();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        final boolean handled = mDetector.onTouchEvent(event);
        if (!handled && event.getAction() == MotionEvent.ACTION_UP) {
            stopNestedScroll();
        }
        return true;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
        return true;
    }

    @Override
    public void onShowPress(MotionEvent e) {
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        dispatchNestedPreScroll(0, (int) distanceY, null, null);
        dispatchNestedScroll(0, 0, 0, 0, null);
        return true;
    }

    @Override
    public void onLongPress(MotionEvent e) {

    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        return true;
    }


}

neurospeech avatar Nov 13 '15 20:11 neurospeech

@neurospeech your code can not be supported before api21

setNestedScrollingEnabled(require api21)

xu6148152 avatar Dec 12 '15 07:12 xu6148152

@xu6148152 I updated my comment for api below 21

neurospeech avatar Dec 22 '15 07:12 neurospeech