aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgabrielemariotti <gabri.mariotti@gmail.com>2014-03-12 19:17:44 +0100
committerLars Greiss <kufikugel@googlemail.com>2014-04-10 23:39:51 +0200
commit40f08d2fd6c01d4979f2f205f4a527ecfa0f6543 (patch)
tree1fb4db34e1963d47c02c631876bd05f4cd4d2bc0
parent37e9541a2f2982849e87764a5a699f584e8ce03f (diff)
LIB: Added a custom scrollListener for ListView and Swipe #98
Change-Id: Ib528114a6f8b3c7bf582577a29d00931074354cb
-rw-r--r--src/com/android/cards/internal/CardArrayAdapter.java21
-rw-r--r--src/com/android/cards/view/CardListView.java24
-rw-r--r--src/com/android/cards/view/listener/SwipeDismissListViewTouchListener.java14
-rw-r--r--src/com/android/cards/view/listener/SwipeOnScrollListener.java51
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) {
+ }
+}