在ScrollView中嵌套ListView - 一个微妙的说明

时间:2013-01-25 19:53:57

标签: android

我已阅读很多帖子,说明ListView不应嵌套在ScrollView中。

我想知道这是否适用于所有AdapterView?

在为一个将嵌套在ScrollView中的自定义列表视图编写一大堆代码之后,先了解它是有帮助的。我想将它基于AdapterView,以便我可以像标准ListView一样使用它(以帮助最小化我当前ListView相关代码的重写)。

谢谢。

2 个答案:

答案 0 :(得分:3)

  

我想知道这是否适用于所有AdapterView?

总的来说,ScrollView与其他孩子的关系并不好。

  

在为一个将嵌套在ScrollView中的自定义列表视图编写一大堆代码之后,先了解它是有帮助的。

无需在ListView中添加ScrollView。只需将ScrollView中的其他内容放入ListView本身,作为页眉/页脚视图,或使用my MergeAdapter或类似技术。

  

我想将它基于AdapterView,以便我可以像标准的ListView

一样使用它

从头开始创建自定义AdapterView并不容易。如果您查看ListView及其AbsListView直接父级的源代码,则会有几千行代码。根据前面的段落,将ScrollView的内容放入ListView会更简单。

答案 1 :(得分:0)

我认为如果你想在ScrollView中嵌套ListView将会有效。它使用起来很简单,因为它扩展了ListView并且只覆盖了一个方法。

唯一的错误是您可能需要使用scrollView.smoothScrollTo(0, 0)将滚动位置设置为头部。

public class ScrollListView extends ListView{
    public ScrollListView(Context context) {
        super(context);
    }

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

    public ScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
            MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

最后,将滚动位置设置为head。

scrollView.smoothScrollTo(0, 0)