1eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette/* 2eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * Copyright (C) 2013 The Android Open Source Project 3eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * 4eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * Licensed under the Apache License, Version 2.0 (the "License"); 5eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * you may not use this file except in compliance with the License. 6eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * You may obtain a copy of the License at 7eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * 8eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * http://www.apache.org/licenses/LICENSE-2.0 9eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * 10eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * Unless required by applicable law or agreed to in writing, software 11eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * distributed under the License is distributed on an "AS IS" BASIS, 12eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * See the License for the specific language governing permissions and 14eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * limitations under the License. 15eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette */ 16eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette 17eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverettepackage android.support.v4.widget; 18eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette 19eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viveretteimport android.view.View; 20eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viveretteimport android.widget.ListView; 21eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette 22eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette/** 23eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * An implementation of {@link AutoScrollHelper} that knows how to scroll 24eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette * through a {@link ListView}. 25eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette */ 26eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverettepublic class ListViewAutoScrollHelper extends AutoScrollHelper { 27eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette private final ListView mTarget; 28eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette 29eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette public ListViewAutoScrollHelper(ListView target) { 30eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette super(target); 31eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette 32eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette mTarget = target; 33eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette } 34eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette 35eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette @Override 36504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette public void scrollTargetBy(int deltaX, int deltaY) { 37cc7e6ffce76f2066838b626ac04536b95a0689c3Chris Banes ListViewCompat.scrollListBy(mTarget, deltaY); 38504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette } 39504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette 40504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette @Override 41504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette public boolean canTargetScrollHorizontally(int direction) { 42504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette // List do not scroll horizontally. 43504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette return false; 44504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette } 45504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette 46504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette @Override 47504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette public boolean canTargetScrollVertically(int direction) { 48eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette final ListView target = mTarget; 49eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette final int itemCount = target.getCount(); 5026a583f97faa79045ef31a7ddd50d73da5afe9d2Alan Viverette if (itemCount == 0) { 5126a583f97faa79045ef31a7ddd50d73da5afe9d2Alan Viverette return false; 5226a583f97faa79045ef31a7ddd50d73da5afe9d2Alan Viverette } 5326a583f97faa79045ef31a7ddd50d73da5afe9d2Alan Viverette 54eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette final int childCount = target.getChildCount(); 55eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette final int firstPosition = target.getFirstVisiblePosition(); 56eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette final int lastPosition = firstPosition + childCount; 57eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette 58504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette if (direction > 0) { 59eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette // Are we already showing the entire last item? 60eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette if (lastPosition >= itemCount) { 61eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette final View lastView = target.getChildAt(childCount - 1); 62eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette if (lastView.getBottom() <= target.getHeight()) { 63eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette return false; 64eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette } 65eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette } 66504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette } else if (direction < 0) { 67eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette // Are we already showing the entire first item? 68eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette if (firstPosition <= 0) { 69eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette final View firstView = target.getChildAt(0); 70eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette if (firstView.getTop() >= 0) { 71eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette return false; 72eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette } 73eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette } 74eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette } else { 75504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette // The behavior for direction 0 is undefined and we can return 76504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette // whatever we want. 77504f6b9c6bcc6b2f50b2aaf4cf9b9bcae7e0e755Alan Viverette return false; 78eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette } 79eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette 80eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette return true; 81eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette } 82eb38a77f4c2b50da454ce0720ceb056f4932f4aeAlan Viverette} 83