2016-09-19 73 views
0

当用户在我的ScrollView的末尾时,我想检测它并加载一些新项目。我已经完成了它,但似乎我使用的功能不适用于某些旧版本的Android。ScrollView的setOnScrollChangeListener:错误

我有这样的代码:

scrollView = (ScrollView) findViewById(R.id.scrollView); 
    scrollView.setOnScrollChangeListener(new ScrollListener(this)); 

则:

@TargetApi(Build.VERSION_CODES.M) 
public class ScrollListener implements View.OnScrollChangeListener { 


ScrollingActivity context; 

public ScrollListener(ScrollingActivity context) { 
    this.context = context; 
} 

@Override 
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 
    ScrollView scrollView = (ScrollView) v; 
    View view = (View) scrollView.getChildAt(scrollView.getChildCount() - 1); 
    int diff = (view.getBottom() - (scrollView.getHeight() + scrollY)); 
    int oldDiff = (view.getBottom() - (scrollView.getHeight() + oldScrollY)); 
    // Si on a atteint le bas de la scrollView et qu'on était en train de descendre 
    if(diff == 0 && oldDiff > 0) { 
     context.endOfScroll(); // function I call to load data... 
    } 
}} 

我有这样的错误:

08-19 21:27:35.135 26504-26504/com.histoire_horreur E/AndroidRuntime: FATAL EXCEPTION: main 
                   java.lang.NoClassDefFoundError: com.histoire_horreur.Listener.ScrollListener 
                    at com.histoire_horreur.MainActivity.createView(MainActivity.java:59) 
                    at com.histoire_horreur.MainActivity.onCreate(MainActivity.java:47) 
                    at android.app.Activity.performCreate(Activity.java:5122) 
                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1150) 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2315) 
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2403) 
                    at android.app.ActivityThread.access$600(ActivityThread.java:165) 
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373) 
                    at android.os.Handler.dispatchMessage(Handler.java:107) 
                    at android.os.Looper.loop(Looper.java:194) 
                    at android.app.ActivityThread.main(ActivityThread.java:5391) 
                    at java.lang.reflect.Method.invokeNative(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:525) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
                    at dalvik.system.NativeStart.main(Native Method) 

正如我告诉,这个代码工作正常,为Android的某些版本,但对于我的Wiko 4.2.2而言并非如此。 我的错误与此处相同:https://forums.xamarin.com/discussion/62241/problem-setting-on-scroll-listener-to-android-horizontal-scroll-view-class-not-found-exception 解决方法是使用ViewTreeObserver,但是,当滚动位于底部时,我无法检测到。我试图做到这一点:

scrollView = (ScrollView) findViewById(R.id.scrollView); 
scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 
@Override 
public void onScrollChanged() { 
// How to get X, Y, Old X and Old Y ? 
} 
}); 

但我无法得到scrollX,scrollY,oldScrollX和oldScrollY。

你知道一种方法可以在Android的所有版本上工作吗?

回答

1

我有同样的问题。 如果您使用ViewTreeObserver代码正常工作,并且只有在底部滚动视图时才会检测到问题。 该snip代码可以帮助您:

@Override 
public void onScrollChanged() { 

    View v = myScrollView.getChildAt(myScrollView.getChildCount() - 1); 
    int diff = (v.getBottom() - (myScrollView.getHeight() + myScrollView.getScrollY())); 
    if (diff <= 0) { 
     //load data here, there is bottom of scrollview 
    } 
}