【问题标题】:ListView with scrollable horizontal rows具有可滚动水平行的 ListView
【发布时间】:2016-02-19 09:54:50
【问题描述】:

使用继承自 BaseAdapter 的自定义列表视图处理程序处理 ListView。我正在尝试实现一种表格样式,其中每一行都可以水平滚动。因此,我使用HorizontalScrollViewLinearLayout 来构造每一行。在每一行中,有多个TextView,每个都带有硬编码文本。一切都在代码中发生,没有 xml 和布局文件。我遇到的问题是我没有看到我添加到我的LinearLayout 的任何TextView 项目。那些TextView 作为子视图添加到LinearLayout 并在onLayout 方法中将它们的布局设置为:

int dx = 0, viewWidth = 180;
for (int i = 0; i < m_Views.length; i++) {

TextView view = m_Views[i];

int textViewWidth = viewWidth;
if (i == 0) {
    textViewWidth *= 2;
}

view.layout(dx, 0, dx + textViewWidth, contentHeight);

dx += textViewWidth;
}
m_HorizontalScrollView.layout(0, 0, contentWidth, contentHeight);
m_LinearLayout.layout(0, 0, dx, contentHeight);

该代码不会呈现 TextView 元素。另外,如果我尝试在设置视图布局之前添加以下行:

view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);

应用程序崩溃并在LinearLayout.javajava.lang.NullPointerException: Attempt to read from null array 中出现以下错误。

我很想知道:

  1. 为什么调用layout方法后文本视图的布局不会改变?
  2. 为什么调用measure方法会导致应用崩溃?

PS:使用RecyclerView 或任何其他需要更改adepter 和列表视图的方法超出了范围,因为这需要更改框架和基类。

【问题讨论】:

    标签: android android-layout listview horizontal-scrolling


    【解决方案1】:

    您不应该在视图上调用layoutmeasure 方向。相反,您应该使用View.setLayoutParams() 设置视图的LayoutParams。由于您使用的是 LinearLayout,因此您将使用 LinearLayout.LayoutParams 作为您的具体实现。删除所有对layoutmeasure 的直接调用,让Android 布局系统处理。

    【讨论】:

    • 试过了,还是不行。我相信这个问题是因为所有父母和其他视图都是onLayout 方法中的布局,这有点行不通。我的问题是为什么TextView 不接受我设置的布局更改
    • 布局更改未被接受的原因是因为您没有正确更新您的小部件问题是Android布局系统将自行调用layout(),其属性来自LayoutParams在显示视图之前,有效地否决了您对layout() 的调用。这就是 Android 的工作方式。我不知道为什么更新LayoutParams 对您不起作用,我需要查看更多代码,但是您尝试做事的方式永远不会奏效。这完全违背了 Android 布局系统的工作方式。
    • 只是我之前消息的延续。 View 方法layout()measure 并不意味着在视图创建期间直接调用。它们在 UI 系统的布局过程中被调用。使用这些方法的唯一原因是如果您需要在 View 子类中覆盖它们,因为由于某种原因,默认的 Android 布局和/或测量不适用于您的用例。只是为了让您了解需要执行此操作的频率,我是一个拥有 100 多个视图的 Android 应用程序的维护者之一,我们从来没有这样做过一次。
    • 最后,如果您在代码中遇到 Android 布局问题,我建议您在 XML 中创建视图,然后在代码中对其进行扩展。它会让你的生活比在代码中进行布局容易得多。
    • 感谢您的详细解释。不幸的是,对于 UI 的布局方式,我无能为力。我可以找到解决方法并跳过使用 measure
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多