Android实现ScrollView的setOnScrollChangeListener方法

5

在我的应用程序中,我发现以下代码可以显示或隐藏某些小部件。但是,我无法在我的片段中实现它,例如:

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
@SlashG 是的,Error:(40, 50) error: incompatible types: Context cannot be converted to OnScrollChangeListener - DolDurma
日志?顺便说一句,当你在处理片段级别的实现接口时,不应该引用你的活动。那听起来很奇怪。 - Victor Santiago
@VictorSantiago能帮我修复一下我的代码吗? - DolDurma
创建一个独立的监听器变量,然后将其设置在 scrollViewTest.setOnScrollChangeListener(mListener); 上。 - Victor Santiago
1个回答

14

在API23以下版本,您不能直接为ScrollView设置onScrollChangedListener。但是,您可以使用此方法:

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

    }
});

参见ScrollView的onScrollListener

编辑

scrollViewTest.setOnScrollChangeListener(context);
在上面的代码中,你试图将Context设置为一个监听器,这是不可能的,因为你的Fragment实现了ObservableHorizontalScrollView.OnScrollListener,所以你应该调用。
scrollViewTest.setOnScrollChangeListener(this);

我正在尝试在我的所有应用程序中使用此类作为单例类。我认为我的设置监听器实现有误,你能帮我修复代码吗?谢谢。 - DolDurma
1
ScrollView#setOnScrollChangeListener接受一个onScrollChangeListener作为参数,而您正在传递一个Context - Sakchham
我该如何为ScrollView附加这个监听器? - DolDurma
问题是这一行 scrollViewTest.getViewTreeObserver().addOnScrollChangedListener();,在实现了片段签名的类之后,我该如何在此行上设置监听器呢? - DolDurma
@Mahdi.Pishguy 如果上述解决方案不起作用,请发布FragmentMarketDetail的完整代码以及导入内容。 - Sakchham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接