API 11 上的 View.canScrollVertical

Posted

技术标签:

【中文标题】API 11 上的 View.canScrollVertical【英文标题】:View.canScrollVertically on API 11 【发布时间】:2015-04-08 01:23:45 【问题描述】:

有没有办法在 API 11 上使用类似于“View.canScrollVertically”的东西?

http://developer.android.com/reference/android/view/View.html#canScrollVertically(int)

谢谢。

【问题讨论】:

【参考方案1】:

所以,实现很简单:

public boolean canScrollVertically(int direction) 
    final int offset = computeVerticalScrollOffset();
    final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
    if (range == 0) return false;
    if (direction < 0) 
        return offset > 0;
     else 
        return offset < range - 1;
    

因此您可以轻松地将其复制到您的代码中;但是,computeX() 方法受到保护。这里的一种解决方案是继承 View 并提供您自己的实现:

public class CustomView extends View 
    public CustomView(Context context) 
        super(context);
    

    public CustomView(Context context, AttributeSet attrs) 
        super(context, attrs);
    

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
    

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public boolean compatCanScrollVertically(int direction) 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
            return canScrollVertically(direction);
         else 
            // TODO Remove when minSdkVersion >= 14
            final int offset = computeVerticalScrollOffset();
            final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
            if (range == 0) return false;
            if (direction < 0) 
                return offset > 0;
             else 
                return offset < range - 1;
            
        
    

【讨论】:

【参考方案2】:

查看了SwipeRefreshLayout的代码,view同样需要一个view是否可以向指定方向滚动。

/**
 * @return Whether it is possible for the child view of this layout to
 *         scroll up. Override this if the child view is a custom view.
 */
public boolean canChildScrollUp() 
    if (android.os.Build.VERSION.SDK_INT < 14) 
        if (mTarget instanceof AbsListView) 
            final AbsListView absListView = (AbsListView) mTarget;
            return absListView.getChildCount() > 0
                    && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
                            .getTop() < absListView.getPaddingTop());
         else 
            return mTarget.getScrollY() > 0;
        
     else 
        return ViewCompat.canScrollVertically(mTarget, -1);
    

scrollDown 也使用同样的方式。

【讨论】:

ViewCompat.canScrollVertically(recyclerView, -1) 本身似乎是 RecyclerView 的一个方便选项。 @android developer 它在 v4 支持库中。我已经在 v10 上对其进行了测试,但最好参考文档。请记住,它仅适用于 RecyclerView。

以上是关于API 11 上的 View.canScrollVertical的主要内容,如果未能解决你的问题,请参考以下文章

IOS6.1 上的 Apple 802.11 API - 有人有正确的捆绑包吗?

IE 11 未在 API 调用中传递授权标头

Google Maps API V3 pinch-to-zoom 不适用于 Windows 8.1 预览版上的 IE 11

MacOSX 上的智能卡 PKCS#11 支持

检查 API 29 上的互联网连接

Coinbase Python API 上的分页