在ListView中滚动时调用哪个函数

时间:2010-11-25 07:25:03

标签: android

public class SynchronisedScrollView extends ListView {

    private ScrollViewListener scrollViewListener = null;

    public SynchronisedScrollView(Context context) {
        super(context);
    }

    public SynchronisedScrollView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    public SynchronisedScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {

        Log.d("Hello", "I am scrolled");
    //  super.onScrollChanged(x, y, oldx, oldy);
    }
}

我想了解listView的滚动程度,因此我扩展了ListView。我能够滚动列表。但是没有调用OnScrollChanged。对于 ScrollView Horizo​​ntalScrollView 每当滚动时都会调用OnScrollChanged。滚动ListView时会触发哪个函数。

2 个答案:

答案 0 :(得分:4)

ListView中,您必须明确注册onScrollListener才能接收onScroll()个事件。

答案 1 :(得分:0)

我认为您正在寻找的方法是:

public void offsetChildrenTopAndBottom(int offset) {
    // ...
}

来自ViewGroup。你可以做的是扩展ListView以收集给予ListView之一的偏移并将其传递给另一个ListView。确保在接收端调用super.offsetChildrenTopAndBottom,否则很容易就会出现堆栈溢出。

我会创建一个私有方法并拥有新的Observable视图。

public class ObservableListView extends ListView {

    private ObservableListView peer;

    // [Constructors] make sure you override all the super constructors. 
    // Can have trouble with layouts otherwise

    public void setPeer(ObservableListView peer) {
        this.peer = peer;
    }

    @Override
    public void offsetTopAndBottom(int offset) {
        super.offsetTopAndBottom(offset);
        if (peer != null) {
            peer.internalVerticalOffset(offset);
        }
    }

    private void internalVerticalOffset(int offset) {
        super.offsetTopAndBottom(offset);
    }

}

如果你觉得自己很勇敢,你也可以定义一个xml属性来给出一个ListView的id,然后让它设置对等关系。 (如果你有兴趣,我可以扩展)


我的不好,这是不工作代码。我试图用隐藏的方法弄清楚如何做到这一点。在这段代码中,我重写了错误的方法。将很快更新。


<强>更新

好的,经过一些研究后我认为最好的方法是将ListView的扩展名与TouchDelegate结合起来。