1

Я работаю над приложением Android, которое имеет ListFragment с помощью CollectionView. Я хочу иметь возможность получать значения из события onScroll в CollectionView по мере их изменения и использовать их в ListFragment или даже CollectionView в нестационарном методе, однако, поскольку событие onScroll статично, он не позволит ссылаться на нестатический метод. Есть ли способ сделать это или есть способ сделать событие onScroll нестатичным для ListFragment?Как получить значения static onScroll из CollectionView обратно в вызывающий 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

Я не вижу ничего статического в onScroll? – cYrixmorten

+0

Я вытащил статику из «частного класса MultiScrollListener», но, несмотря на это, я все еще получаю сообщение об ошибке «Нестационарный метод». MyMethod (int i) не может ссылаться на статический контекст «когда я добавляю myMethod (i); –

+0

А? Является ли это MultiScrollListener статическим или? – cYrixmorten

ответ

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) Пусть ваша деятельность реализует 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 так может содержать ошибки, просто хотел показать вам идею.

Кстати, попробуйте избежать статических вызовов активности или фрагмента, так как это может очень быстро привести к головным болям из-за изменений ориентации и тому подобного. Вы просто не можете полагаться на состояние, чтобы быть таким же стабильным, как обработка статических вызовов. Даже если вы будете осторожны, не столкнетесь с проблемами времени выполнения, он, скорее всего, взорвется в банке кода спагетти позже.

+0

Шина событий еще проще в использовании, чем otto. –

+0

Не пробовал Отто, но просто люблю EventBus :) – cYrixmorten