1

我正在开发一个使用 CollectionView 的具有 ListFragment 的 Android 应用程序。我希望能够从 CollectionView 中的 onScroll 事件中获取值,因为它们发生变化并在 ListFragment 甚至 CollectionView 中以非静态方法使用它们,但是由于 onScroll 事件是静态的,因此它不允许引用一种非静态方法。有没有办法做到这一点,或者有没有办法使 ListFragment 的 onScroll 事件非静态?

这里是基本的 CollectionView onScroll 事件代码

    private  class MultiScrollListener implements OnScrollListener {
    private  Set<OnScrollListener> children = new HashSet<OnScrollListener>();


    public void addOnScrollListener(OnScrollListener listener) {
        children.add(listener);
    }
    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {

        for (OnScrollListener listener : children) {
            listener.onScrollStateChanged(absListView, i);
        }
    }

    @Override
    public void onScroll(AbsListView absListView, int i, int i2, int i3) {

   // ?????
   // ?????  I'd like to get the values of i, i2 and i3, from above
   // ?????  as they change into a non-static method.
   // ?????
             myMethod(i);

   //      I get the following error from Android Studio: 
   //      non static method 'myMethod(int i) cannot be referenced from a static context
   //


        for (OnScrollListener listener : children) {
            listener.onScroll(absListView, i, i2, i3);

        }
    }
}

正如建议的那样,我什至尝试将所有内容公开,如下所示,但没有改变,仍然是同样的错误。

    public  class MultiScrollListener implements OnScrollListener {
    public Set<OnScrollListener> children = new HashSet<OnScrollListener>();


    public void addOnScrollListener(OnScrollListener listener) {
        children.add(listener);
    }
    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {

        for (OnScrollListener listener : children) {
            listener.onScrollStateChanged(absListView, i);
            BrowseCorrelatedSessionsActivity.onBrowseSessionScrolled(1);
        }
    }

    @Override
    public void onScroll(AbsListView absListView, int i, int i2, int i3) {

        for (OnScrollListener listener : children) {
            listener.onScroll(absListView, i, i2, i3);

        }
    }
4

1 回答 1

1

正如评论中所建议的,我相信 EventBus 可以处理这种情况

只是想通过公开类并创建回调来说明我的意思:

public  class MultiScrollListener implements OnScrollListener {

    // define callback interface
    public interface MultiScrollListenerCallback {
        public void onBrowseSessionScrolled(int someInt);
    }

    public Set<OnScrollListener> children = new HashSet<OnScrollListener>();

    private MultiScrollListenerCallback multiScrollListenerCallback;

    // get a reference to the callback in the constructor
    public MultiScrollListener(MultiScrollListenerCallback multiScrollListenerCallback) {
        this.multiScrollListenerCallback = multiScrollListenerCallback;
    }


    public void addOnScrollListener(OnScrollListener listener) {
        children.add(listener);
    }
    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {

        for (OnScrollListener listener : children) {
            listener.onScrollStateChanged(absListView, i);
            // speak through the callback
            multiScrollListenerCallback.onBrowseSessionScrolled(1); 
        }
    }

    @Override
    public void onScroll(AbsListView absListView, int i, int i2, int i3) {

        for (OnScrollListener listener : children) {
            listener.onScroll(absListView, i, i2, i3);

        }
    }
}

现在要使用这个花哨的回调,你有两个选择

1)让你的Activity实现MultiScrollListenerCallback

public class BrowseCorrelatedSessionsActivity implements MultiScrollListenerCallback {
    ...
    MultiScrollListener msl = new MultiScrollListener(this);
    ...
    public void onBrowseSessionScrolled(int someInt) {
        // handle callback
    }
}

2)或者做一个匿名内部类

public class BrowseCorrelatedSessionsActivity {
    ...
    MultiScrollListener msl = new MultiScrollListener(new MultiScrollListenerCallback() {
        public void onBrowseSessionScrolled(int someInt) {
            // handle callback
        }
    });
}

请注意,此代码是直接在 SO 上编写的,因此可能包含错误,只是想向您展示这个想法。

顺便说一句,请尽量避免对 Activity 或 Fragment 进行静态调用,因为这可能会由于方向变化等而很快导致头痛。你不能依赖状态来像处理静态调用一样稳定。即使你很小心,没有遇到运行时问题,它也很可能在以后在一罐意大利面条代码中爆炸。

于 2014-09-14T22:22:16.563 回答