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);

        }
    }
}

この派手なコールバックを使用するには、2 つのオプションがあります

1) アクティビティに 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 に答える