diff options
| author | gabrielemariotti <gabri.mariotti@gmail.com> | 2014-03-12 19:17:44 +0100 |
|---|---|---|
| committer | Lars Greiss <kufikugel@googlemail.com> | 2014-04-10 23:39:51 +0200 |
| commit | 40f08d2fd6c01d4979f2f205f4a527ecfa0f6543 (patch) | |
| tree | 1fb4db34e1963d47c02c631876bd05f4cd4d2bc0 | |
| parent | 37e9541a2f2982849e87764a5a699f584e8ce03f (diff) | |
LIB: Added a custom scrollListener for ListView and Swipe #98
Change-Id: Ib528114a6f8b3c7bf582577a29d00931074354cb
4 files changed, 100 insertions, 10 deletions
diff --git a/src/com/android/cards/internal/CardArrayAdapter.java b/src/com/android/cards/internal/CardArrayAdapter.java index d2fab52..7ec50a7 100644 --- a/src/com/android/cards/internal/CardArrayAdapter.java +++ b/src/com/android/cards/internal/CardArrayAdapter.java @@ -26,6 +26,7 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AbsListView; import android.widget.ListView; import java.util.HashMap; @@ -36,6 +37,7 @@ import com.android.cards.internal.base.BaseCardArrayAdapter; import com.android.cards.view.CardListView; import com.android.cards.view.CardView; import com.android.cards.view.listener.SwipeDismissListViewTouchListener; +import com.android.cards.view.listener.SwipeOnScrollListener; import com.android.cards.view.listener.UndoBarController; import com.android.cards.view.listener.UndoCard; @@ -199,16 +201,25 @@ public class CardArrayAdapter extends BaseCardArrayAdapter implements UndoBarCon protected void setupSwipeableAnimation(final Card card, CardView cardView) { HashMap<Integer, Card.OnLongCardClickListener> multipleOnLongClickListner = card.getMultipleOnLongClickListener(); - if (card.isSwipeable()){ - if (mOnTouchListener == null){ + if (card.isSwipeable()) { + if (mOnTouchListener == null) { mOnTouchListener = new SwipeDismissListViewTouchListener(mCardListView, mCallback); // Setting this scroll listener is required to ensure that during // ListView scrolling, we don't look for swipes. - mCardListView.setOnScrollListener(mOnTouchListener.makeScrollListener()); - } + if (mCardListView.getOnScrollListener() == null) { + SwipeOnScrollListener scrollListener = new SwipeOnScrollListener(); + scrollListener.setTouchListener(mOnTouchListener); + mCardListView.setOnScrollListener(scrollListener); + } else { + AbsListView.OnScrollListener onScrollListener=mCardListView.getOnScrollListener(); + if (onScrollListener instanceof SwipeOnScrollListener) { + ((SwipeOnScrollListener) onScrollListener).setTouchListener(mOnTouchListener); + } + } + mCardListView.setOnTouchListener(mOnTouchListener); + } cardView.setOnTouchListener(mOnTouchListener); - // We may have partial onlongclicklistener. Restore onTouchListener for this views. setPartialOnTouchListeners(cardView, mOnTouchListener, multipleOnLongClickListner); } else { diff --git a/src/com/android/cards/view/CardListView.java b/src/com/android/cards/view/CardListView.java index 5189cb9..cbfdd56 100644 --- a/src/com/android/cards/view/CardListView.java +++ b/src/com/android/cards/view/CardListView.java @@ -35,6 +35,7 @@ import com.android.cards.R; import com.android.cards.internal.Card; import com.android.cards.internal.CardArrayAdapter; import com.android.cards.internal.CardCursorAdapter; +import com.android.cards.view.listener.SwipeOnScrollListener; /** * Card List View. @@ -75,7 +76,12 @@ public class CardListView extends ListView implements CardView.OnExpandListAnima */ protected CardCursorAdapter mCursorAdapter; - //-------------------------------------------------------------------------- + /** + * Custom ScrollListener to be used with a CardListView and cards with swipe action + */ + protected SwipeOnScrollListener mOnScrollListener; + +//-------------------------------------------------------------------------- // Fields for expand/collapse animation //-------------------------------------------------------------------------- @@ -240,6 +246,22 @@ public class CardListView extends ListView implements CardView.OnExpandListAnima mCursorAdapter.setRowLayoutId(list_card_layout_resourceID); } + /** + * Returns local scroll event listener + */ + public OnScrollListener getOnScrollListener( ) { + return this.mOnScrollListener; + } + + /** + * Overrides the set on scroll listener method and registers local reference + */ + @Override + public void setOnScrollListener( OnScrollListener mOnScrollListener ) { + super.setOnScrollListener( mOnScrollListener ); + if (mOnScrollListener instanceof SwipeOnScrollListener) + this.mOnScrollListener = (SwipeOnScrollListener)mOnScrollListener; + } //-------------------------------------------------------------------------- // Expand and Collapse animator diff --git a/src/com/android/cards/view/listener/SwipeDismissListViewTouchListener.java b/src/com/android/cards/view/listener/SwipeDismissListViewTouchListener.java index c3c7f70..7976318 100644 --- a/src/com/android/cards/view/listener/SwipeDismissListViewTouchListener.java +++ b/src/com/android/cards/view/listener/SwipeDismissListViewTouchListener.java @@ -51,9 +51,10 @@ import com.android.cards.internal.Card; * handling list item clicks, etc. * * <p>After creating the listener, the caller should also call - * {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}, passing - * in the scroll listener returned by {@link #makeScrollListener()}. If a scroll listener is - * already assigned, the caller should still pass scroll changes through to this listener. This will + * {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}, using a + * {@link it.gmariotti.cardslib.library.view.listener.SwipeOnScrollListener}. + * + * If a scroll listener is already assigned, the caller should still pass scroll changes through to this listener. This will * ensure that this {@link SwipeDismissListViewTouchListener} is paused during list view * scrolling.</p> * @@ -161,6 +162,7 @@ public class SwipeDismissListViewTouchListener implements View.OnTouchListener { * * @see SwipeDismissListViewTouchListener */ + /* public AbsListView.OnScrollListener makeScrollListener() { return new AbsListView.OnScrollListener() { @Override @@ -172,7 +174,7 @@ public class SwipeDismissListViewTouchListener implements View.OnTouchListener { public void onScroll(AbsListView absListView, int i, int i1, int i2) { } }; - } + }*/ @Override public boolean onTouch(View view, MotionEvent motionEvent) { @@ -186,6 +188,10 @@ public class SwipeDismissListViewTouchListener implements View.OnTouchListener { return false; } + if (mSwiping){ + return true; + } + // TODO: ensure this is a finger, and set a flag // Find the child view that was touched (perform a hit test) diff --git a/src/com/android/cards/view/listener/SwipeOnScrollListener.java b/src/com/android/cards/view/listener/SwipeOnScrollListener.java new file mode 100644 index 0000000..efcc193 --- /dev/null +++ b/src/com/android/cards/view/listener/SwipeOnScrollListener.java @@ -0,0 +1,51 @@ +/* + * ****************************************************************************** + * Copyright (c) 2013-2014 Gabriele Mariotti. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ***************************************************************************** + */ + +package com.android.cards.view.listener; + +import android.widget.AbsListView; + +/** + * Returns an {@link android.widget.AbsListView.OnScrollListener} to be added to the {@link + * android.widget.ListView} using {@link android.widget.ListView#setOnScrollListener(android.widget.AbsListView.OnScrollListener)}. + * If a scroll listener is already assigned, the caller should still pass scroll changes through + * to this listener. This will ensure that this {@link SwipeDismissListViewTouchListener} is + * paused during list view scrolling.</p> + * + * @author Gabriele Mariotti (gabri.mariotti@gmail.com) + * @see SwipeDismissListViewTouchListener + */ +public class SwipeOnScrollListener implements AbsListView.OnScrollListener { + + private SwipeDismissListViewTouchListener mTouchListener; + + public void setTouchListener(final SwipeDismissListViewTouchListener touchListener) { + mTouchListener = touchListener; + } + + @Override + public void onScrollStateChanged(final AbsListView view, final int scrollState) { + if (mTouchListener != null) { + mTouchListener.setEnabled(scrollState != AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); + } + } + + @Override + public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { + } +} |
