膨胀Android列表子视图 - >重复的ID

时间:2016-02-26 03:56:15

标签: android android-layout listview android-fragments

我在Android应用中有一些内容显示在列表中。每个列表条目都有相似的字段 - 比方说一个图片,一些文本和一个文本框。但是,某些列表条目与其他条目不同。内容的顺序基于服务器调用的结果。

列表本身需要相当动态,我目前正在使用线性布局而不是列表视图,原因有几个。我的代码看起来像这样:

LinearLayout list = findViewById(android.R.id.list);

while (more content to add) {
    switch (content type) {
        case A:
            View v = layoutInflater.inflate(R.layout.list_item_type_a, list, false);
            EditText editText = (EditText)v.findViewById(android.R.id.edit);
            // Do stuff with editText
            list.addView(v);
            break;
        case B:
            View v = layoutInflater.inflate(R.layout.list_item_type_b, list, false);
            ....
    }
}

这很有效。除了 - 当我把它放在片段中并旋转屏幕时,现在我的应用程序崩溃了,因为我有多个具有相同android.R.id.edit标识符的字段。

我原以为这是一个相当优雅的解决方案,Android神似乎不同意。我是否需要删除所有xml子布局的ID?如果我走这条路,我应该如何获取对内容的引用?

4 个答案:

答案 0 :(得分:1)

很明显,ListViewRecyclerView最好在此处使用,但由于您已说明您有理由不这样做,我建议您禁用自动状态保存对于每个观点。

您只需拨打editText.setSaveEnabled(false)即可解决问题,但副作用是不会自动保留视图的状态(例如输入数据会丢失)。如果您自己维护这些数据并在配置更改或状态恢复时进行恢复,这应该是一个完全可行的解决方案。

我相信你也可以在包含setSaveFromParentEnabled(false)的地方拨打LinearLayout(虽然我自己还没有使用过这个标志),这会禁用任何在子层次结构中查看。同样需要注意。

答案 1 :(得分:1)

我建议使用initial_spark_worker_resources: 0.7 代替ListView并创建自定义LinearLayout来填充adapter。您仍然可以使用ListView布局,然后将其添加到list_item newView方法的列表中。通过方法传递您的内容类型,例如adapter。像这样:

getItemViewType()

答案 2 :(得分:1)

我认为这个问题是由于设备屏幕旋转而发生的

当手机旋转并且屏幕改变方向时,Android通常会破坏应用程序的现有活动和碎片并重新创建它们。 Android会这样做,以便您的应用程序可以根据新配置重新加载资源。

处理方向更改的最重要方面是保存状态。在大多数情况下,这涉及实现 onSaveInstanceState 方法(这可能在您的Activity,Fragment或两者中)并将您需要保存的值放在传递给方法的Bundle参数中。

有关详细信息和代码示例... Please read this article

答案 3 :(得分:0)

如果您有动态列表,则应使用ListView或RecyclerView。