2016-02-26 42 views
0

我在Android应用程序中显示了一些内容。每个列表条目都有类似的字段 - 比如一张图片,一些文本和一个文本框。但是,一些列表条目与其他列表条目不同。内容的顺序基于服务器调用的结果。充气Android列表子视图 - >重复的ID

该列表本身需要相当动态,我目前使用linearlayout而不是listview有几个原因。我的代码看起来像这样:

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

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

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

回答

1

很显然,ListViewRecyclerView会比这里更好用,不过既然你声明你有理由不这样做,我建议你为每个视图禁用自动状态保存。

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

我相信你也可以只调用setSaveFromParentEnabled(false)对含LinearLayout(虽然我还没有使用该标志我自己),这应该禁用状态节省在子层次中的任何视图。同样的警告适用。

+0

通常我不会这样做,但我的问题已经得到了很少的意见,我不知道该怎么做,所以你可以看看这个[问题](http:// stackoverflow。 com/questions/35729545/reflection-in-background-android)?我真的很感激它 – Dan

+0

谢谢,最终这是我一起去的解决方案。我花了一段时间回去尝试再次使用ListView,但遇到了很多(记录完备的)将EditText放在ListView和Android的焦点系统中的问题。堆栈溢出包含许多潜在的修复程序,但是我无法让它们中的任何一个在我需要支持的所有Android版本上工作。 – Brad

0

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

1

我建议使用ListView而不是LinearLayout并创建一个自定义adapter来填充ListView。您仍然可以使用list_item布局,然后将它们添加到adapternewView方法的列表中。通过一种方法传递您的内容类型,比如getItemViewType()。事情是这样的:

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    // Choose the layout type 
    int contentType = getItemViewType(); 
    int layoutId = -1; 
    switch (contentType) { 
     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); 
     .... 
     } 
    } 
+0

感谢您的反馈。我尝试了这种方法,但在尝试更改焦点时遇到了ListView中EditText的问题。看到我对@ kcoppock上面的答案的评论。 – Brad

1

我觉得这个问题的发生是由于设备屏幕旋转

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

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

欲了解更多详细信息和代码示例... Please read this article