Android 实现 ScrollView setOnScrollChangeListener

Posted

技术标签:

【中文标题】Android 实现 ScrollView setOnScrollChangeListener【英文标题】:Android implementing ScrollView setOnScrollChangeListener 【发布时间】:2016-11-03 10:44:56 【问题描述】:

在我用于显示和隐藏一些小部件的应用程序中,我在本网站的以下代码中找到了这个,但我无法在我的片段上实现它,例如:

public abstract class HidingScrollListener extends RecyclerView.OnScrollListener 
    private static final int HIDE_THRESHOLD = 20;
    private int mScrolledDistance = 0;
    private boolean mControlsVisible = true;
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
        super.onScrolled(recyclerView, dx, dy);

        int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();

        if (firstVisibleItem == 0) 
            if(!mControlsVisible) 
                onShow();
                mControlsVisible = true;
            
         else 
            if (mScrolledDistance > HIDE_THRESHOLD && mControlsVisible) 
                onHide();
                mControlsVisible = false;
                mScrolledDistance = 0;
             else if (mScrolledDistance < -HIDE_THRESHOLD && !mControlsVisible) 
                onShow();
                mControlsVisible = true;
                mScrolledDistance = 0;
            
        
        if((mControlsVisible && dy>0) || (!mControlsVisible && dy<0)) 
            mScrolledDistance += dy;
        
    

    public abstract void onHide();
    public abstract void onShow();

我的片段:

public class FragmentMarketDetail extends Fragment implements ObservableHorizontalScrollView.OnScrollListener 

    private ScrollView scrollViewTest;
    private Context    context;

    public static FragmentMarketDetail newInstance() 
        FragmentMarketDetail fragmentFirst = new FragmentMarketDetail();
        return fragmentFirst;
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        View view = inflater.inflate(R.layout.fragment_online_categories, container, false);
        scrollViewTest = (ScrollView) view.findViewById(R.id.scrollViewTest);
        scrollViewTest.setOnScrollChangeListener(context);
        return view;
    

    @Override
    public void onScrollChanged(ObservableHorizontalScrollView scrollView, int x, int y, int oldX, int oldY) 
        Log.e("-----> onScrollChanged", x + "");
    

    @Override
    public void onEndScroll(ObservableHorizontalScrollView scrollView) 
        Log.e("----->onEndScroll ", "");

    

    @Override
    public void onAttach(Activity activity) 
        super.onAttach(activity);
        context = activity;
    

我收到此行的错误:scrollViewTest.setOnScrollChangeListener(context);

【问题讨论】:

您得到的错误是什么?你能分享堆栈跟踪吗? @SlashG 是的,Error:(40, 50) error: incompatible types: Context cannot be converted to OnScrollChangeListener 日志?顺便说一句,当您在片段级别处理已实现的接口时,您不应该引用您的活动。这听起来很奇怪。 @VictorSantiago 你能修复我的代码吗? 在单独的变量上创建侦听器,然后将其设置为scrollViewTest.setOnScrollChangeListener(mListener); 【参考方案1】:

您不能将 onScrollChangedListener 设置为 API23 正下方的 ScrollView。 但是你可以使用这个

scrollView.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() 

    @Override
    public void onScrollChanged() 

        int scrollX = rootScrollView.getScrollX(); //for horizontalScrollView
        int scrollY = rootScrollView.getScrollY(); //for verticalScrollView
        //DO SOMETHING WITH THE SCROLL COORDINATES

    
);

见onScrollListener for a ScrollView

编辑

scrollViewTest.setOnScrollChangeListener(context);

在上述行中,您试图将Context 设置为不可能的侦听器,因为您应该调用Fragment 实现ObservableHorizontalScrollView.OnScrollListener

scrollViewTest.setOnScrollChangeListener(this);

【讨论】:

我正在尝试在我的所有应用程序中将此类用作 Singelton 类。我认为我的设置监听器在实现它时是错误的,你能修复我的代码吗?谢谢 ScrollView#setOnScrollChangeListener 接受 onScrollChangeListener 作为参数,而您传入​​的是 Context 我怎样才能为 ScrollView 附加这个监听器? 问题是这一行scrollViewTest.getViewTreeObserver().addOnScrollChangedListener(); 在片段签名上实现类后如何在这一行上设置监听器? @Mahdi.Pishguy 如果上述解决方案不起作用,请将 FragmentMarketDetail 的完整代码与导入一起发布

以上是关于Android 实现 ScrollView setOnScrollChangeListener的主要内容,如果未能解决你的问题,请参考以下文章

Android实现两个ScrollView互相联动,同步滚动的效果

Android 实现 ScrollView setOnScrollChangeListener

Android -- 自定义ScrollView实现放大回弹效果

Android ScrollView 实现整个界面变成列表

Android沉浸式状态栏 + scrollView顶部伸缩 + actionBar渐变

Android 中 ScrollView 如何实现类似 iPhone 中 UIScrollView 的分页功能?