在ScrollView中嵌套ListView - 微妙的澄清

3

我已经阅读了很多关于ListView不应该嵌套在ScrollView中的帖子。

我想知道这是否适用于一般的AdapterView?

在编写将被嵌套在ScrollView中的自定义列表视图之前,了解这一点将会很有帮助。我想基于AdapterView来构建它,以便可以像标准ListView那样使用它(以帮助最小化当前与ListView相关的代码的重写)。

谢谢。

2个回答

3

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

总的来说,ScrollView 与其他控件不太兼容。

在编写嵌套在 ScrollView 中的自定义列表视图的大量代码之前,了解它是否适用会很有帮助。

没有必要将 ListView 放入 ScrollView 中。只需将 ScrollView 的其他内容放入 ListView 中,作为头部/尾部视图或使用 my MergeAdapter 等技术即可。

我想基于 AdapterView 来创建它,以便我可以像使用标准 ListView 一样使用它

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


我继续按照这个教程 http://developer.sonymobile.com/2010/05/20/android-tutorial-making-your-own-3d-list-part-1/ 进行操作(该链接是在这里的SO作为对相关问题的答案发布的)。将此视图放入滚动视图中会产生与内置ListView相同的行为:可折叠列表。 - samus
1
@SamusArin:听起来像是一个垂直的LinearLayout中有三个ListViews,它本身在一个FrameLayout中。在标题点击时,您将所选的ListView重新父级为FrameLayout的后代之一,以便它填充屏幕并覆盖其他两个ListViews。我担心您提出的UI在手机上使用起来会很困难--要么您的行太小,要么三个堆叠的列表视图除了标题之外几乎没有内容。此外,用户可能不知道如何返回到三个堆叠的列表视图(BACK按钮?还是其他什么?)。 - CommonsWare
这个版本适用于10英寸的平板电脑,在横向屏幕上(抱歉,之前忘了提)。我会尝试你的技术。我认为他们从iPad的图形用户界面上得到了灵感,这是一个直截了当的想法,但是Android仍然相当严格(没关系,毕竟它还很年轻)。他们必须滚动到标题并折叠。 - samus
1
@SamusArin:"但由于这个限制它非常专业化" -- 我喜欢把它想象成一棵非常短的树。 :-) "ELV适配器的构造函数接受类型为Context的上下文" -- 在片段上调用getActivity()以获取托管Activity,它是一个Context - CommonsWare
它(ExpandleListView)有效了,非常感谢您的所有帮助和建议。每当出现新问题时,我一定会尝试您的一些想法。 - samus
显示剩余9条评论

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

最后,将滚动位置设置为顶部。
scrollView.smoothScrollTo(0, 0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接