我使用CollectionView处理具有ListFragment的Android应用程序。我希望能够从CollectionView中的onScroll事件中获取值,因为它们在ListFragment中更改并使用它们,甚至在非静态方法中使用它们,但是因为onScroll事件是静态的,所以它不会允许引用非静态方法。有没有办法做这个或有没有办法使onScroll事件非静态的ListFragment?
这里是基本的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);
}
}
答案 0 :(得分: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上,因此可能包含错误,只是想向您展示这个想法。
顺便说一下,请尽量避免对活动或片段进行静态调用,因为这可能会很快导致由于方向更改等导致的头痛。你只是不能依赖状态像处理静态调用一样稳定。即使你很小心,也没有遇到运行时的麻烦,以后很可能会在一堆意大利面条代码中爆炸。