Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将静态onScroll事件值从CollectionView返回到调用ListFragment,或者在类的非静态方法中使用这些值?_Java_Android_Android Listfragment_Onscroll_Onscrolllistener - Fatal编程技术网

Java 如何将静态onScroll事件值从CollectionView返回到调用ListFragment,或者在类的非静态方法中使用这些值?

Java 如何将静态onScroll事件值从CollectionView返回到调用ListFragment,或者在类的非静态方法中使用这些值?,java,android,android-listfragment,onscroll,onscrolllistener,Java,Android,Android Listfragment,Onscroll,Onscrolllistener,我正在使用CollectionView开发一个具有ListFragment的Android应用程序。我希望能够从CollectionView中的onScroll事件中获取更改后的值,并在ListFragment中甚至在非静态方法中的CollectionView中使用这些值,但是由于onScroll事件是静态的,因此它不允许引用非静态方法。有没有办法做到这一点,或者有没有办法使ListFragment的onScroll事件成为非静态的 下面是基本的CollectionView onScroll事件

我正在使用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);

        }
    }
}
私有类MultiScrollListener实现OnScrollListener{
private Set children=new HashSet();
public void addOnScrollListener(OnScrollListener侦听器){
添加(侦听器);
}
@凌驾
CrollStateChanged上的公共无效(AbsListView AbsListView,int i){
for(OnScrollListener侦听器:儿童){
onScrollStateChanged(absListView,i);
}
}
@凌驾
public void onScroll(AbsListView AbsListView、int i、int i2、int i3){
// ?????
//我想从上面得到I,i2和i3的值
//当它们转变为非静态方法时。
// ?????
我的方法(一);
//我从Android Studio获得以下错误:
//无法从静态上下文引用非静态方法“myMethod(int i)”
//
for(OnScrollListener侦听器:儿童){
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);

        }
    }
公共类MultiScrollListener实现OnScrollListener{
public Set children=new HashSet();
public void addOnScrollListener(OnScrollListener侦听器){
添加(侦听器);
}
@凌驾
CrollStateChanged上的公共无效(AbsListView AbsListView,int i){
for(OnScrollListener侦听器:儿童){
onScrollStateChanged(absListView,i);
BrowseCorrelatedSessionActivity.onBrowseSession滚动(1);
}
}
@凌驾
public void onScroll(AbsListView AbsListView、int i、int i2、int i3){
for(OnScrollListener侦听器:儿童){
onScroll(absListView,i,i2,i3);
}
}

正如评论中所建议的,我相信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);

        }
    }
}
2) 或者创建一个匿名的内部类

public class BrowseCorrelatedSessionsActivity {
    ...
    MultiScrollListener msl = new MultiScrollListener(new MultiScrollListenerCallback() {
        public void onBrowseSessionScrolled(int someInt) {
            // handle callback
        }
    });
}
请注意,此代码是直接在此处编写的,因此可能包含错误,只是想向您展示这一想法


顺便说一句,请尽量避免对某个活动或片段进行静态调用,因为这可能会很快因方向更改等原因导致头痛。你不能依赖状态来像处理静态调用一样稳定。即使你很小心,没有遇到运行时的问题,它也可能会在一堆垃圾中爆炸etti代码。

我没有看到关于onScroll的任何静态信息?我从“私有类MultiScrollListener”中提取了静态信息,但不管怎样,当我添加myMethod(I)时,仍然会收到错误消息“非静态方法”myMethod(int I)无法从静态上下文引用”;嗯?是MultiScrollListener是静态的,还是?您需要静态类字段和静态方法,您可以在onscroll()中调用表单-方法我想说的是摆脱静态。将其
公共类MultiScrollListener
放在单独的文件中,并将其所需的任何数据交给构造函数。然后定义回调接口以便调用myMethod并将其交给构造函数。事件总线比otto更易于使用。
public class BrowseCorrelatedSessionsActivity {
    ...
    MultiScrollListener msl = new MultiScrollListener(new MultiScrollListenerCallback() {
        public void onBrowseSessionScrolled(int someInt) {
            // handle callback
        }
    });
}