不会触发/调用许多嵌套的滚动回调?

时间:2016-08-26 11:14:28

标签: c# android android-layout xamarin.android

我还不熟悉Android界面中的高级自定义功能。我想要实现的是创建类似SwipeRefreshLayout的东西 - 这种布局并不像我想要的那样好(关于它是如何灵活的,因为我们不能轻易改变刷新指标,这意味着我们似乎有坚持它提供的东西 - 默认的加载圆圈指示符。

同样尝试重新创建这种布局对学习有好处,所以我真的需要自己做。这里的问题是关于嵌套滚动回调,它们是DispatchNestedScrollOnNestedScrollAcceptedOnStartNestedScrollOnStopNestedScroll,......无论我是什么,它们都不会被触发/调用# 39;我试过了。

以下是我的代码片段:

public class PullToRefreshLayout : ViewGroup, Android.Support.V4.View.INestedScrollingChild, Android.Support.V4.View.INestedScrollingParent
{
   public PullToRefreshLayout(Context context) : this(context, null, 0) {

    }
    public PullToRefreshLayout(Context context, Android.Util.IAttributeSet attrs) : this(context, attrs, 0)
    {
        NestedScrollingEnabled = true;            
    }
    public PullToRefreshLayout(Context context, Android.Util.IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
    {
        nsChildHelper = new NestedScrollingChildHelper(this);
        nsParentHelper = new NestedScrollingParentHelper(this);
        NestedScrollingEnabled = true;
    }
    NestedScrollingChildHelper nsChildHelper;
    NestedScrollingParentHelper nsParentHelper;
    protected override void OnLayout(bool changed, int left, int top, int right, int bottom)
    {
        if (ChildCount > 0)
        {
            var content = GetChildAt(0);
            content.Layout(left, top, right, bottom);
        }
    }
    public override bool NestedScrollingEnabled
    {
        get
        {
            //return base.NestedScrollingEnabled;
            return nsChildHelper.NestedScrollingEnabled;
        }

        set
        {                
            nsChildHelper.NestedScrollingEnabled = value;
        }
    }
    //Here are just some included callbacks which are never called
    public override void OnNestedScrollAccepted(View child, View target, [GeneratedEnum] ScrollAxis axes)
    {
        base.OnNestedScrollAccepted(child, target, axes);
    }
    public override void OnNestedPreScroll(View target, int dx, int dy, int[] consumed)
    {
        base.OnNestedPreScroll(target, dx, dy, consumed);
    }
    public override void OnNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed)
    {
        base.OnNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
    }
    //and more ...
}

自定义视图包含一个简单的ListView(就像我们使用SwipeRefreshLayout的方式一样),如下所示:

<CustomViews.PullToRefreshLayout
     android:id="@+id/refreshLayout"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent">
   <ListView
      android:layout_width="match_parent"
      android:layout_height="fill_parent"
      android:id="@+id/listView1"/>
</CustomViews.PullToRefreshLayout>

所以我希望在来回滚动ListView时,至少应该触发一些嵌套的滚动回调,但不能触发它们。

在我能够实现自己的pull-to-refresh布局功能之前,我需要在适当的时刻触发一些适当的回调。

我希望这里有人可以弄清楚错误或只是给我一些可能的建议来解决你的经验问题。最后,代码是针对运行Android 6.0的Visual Studio模拟器运行的(我相信问题仍然存在于较低版本的Android上)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

ListView不支持嵌套滚动,因为ListView未实现NestedScrollingChild。 因此,嵌套的滚动回调永远不会被触发/调用。

我建议您使用RecyclerViewNestedScrollView或其他实现NestedScrollingChild的视图,而不是ListView

注意:

SwipeRefreshLayout通过工具ListView支持onTouchEvent ,而不是嵌套滚动。这是source code