【问题标题】:Android implementing ScrollView setOnScrollChangeListenerAndroid 实现 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);

标签: android


【解决方案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 的完整代码与导入一起发布
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多