【问题标题】:How to sort LinearLayout's children programatically如何以编程方式对 LinearLayout 子项进行排序
【发布时间】:2016-01-16 04:45:16
【问题描述】:

我有水平方向的线性布局,其中几乎没有 ImageViews(在 xml 中硬编码)。我必须根据 MultiselectListPreference 对它们进行排序(所有先选中,然后再取消选中)。把选中的放在开头我试过了

((LinearLayout)imageView.getParent()).removeView(imageView);
((LinearLayout)imageView.getParent()).addView(imageView,0);

并且没有做任何未经检查的事情。但它给了我“指定的孩子已经存在。你必须在视图的给定父级上调用 removeView(view)”虽然我已经调用了它。这可能是因为所有这些 ImageView 都存在于 xml 中。如何获得所需的子 ImageView 排列。如果LinearLayout根本不够用,我这里应该用RecyclerView,会不会比较重?

【问题讨论】:

  • 我绝对认为,每当您谈论重新排序视图时,最好使用某种类型的 RecyclerView 或 ListView。它们是为此类工作而设计的,不会产生多次重新布局的巨大成本。
  • 如果您刚刚从父视图中删除 imageView,我对 imageView.getParent() 的工作方式感到困惑......
  • @GabeSechan 从今以后我会详细介绍 Recycler。
  • @cricket_007 - 即使我很困惑,但这是我找到的排序解决方案。可能是因为尽管视图已从父级中删除,但对象“imageView”仍将其父级的信息保存在其“父级”字段中。

标签: android android-linearlayout


【解决方案1】:

将父视图投射到 ViewGroup 以便 removeView 方法起作用。

((ViewGroup)imageView.getParent()).removeView(imageView);

【讨论】:

  • 他已经将它转换为一个 LinearLayout,它是 ViewGroup 的一个子级。这不会解决任何问题。
  • 确实解决了我的问题。连我都很惊讶。 @GabeSechan 我建议你投票支持它。
  • 可以稍微优化一下,这样你就可以得到一个 ViewGroup 对象,而不是每次都调用 getParent() 和强制转换,但这应该可以。不知道为什么转换为 LinearLayout 不起作用.. 是时候挖掘源代码了
  • 您是否将这两行都从 LinearLayouts 更新为 ViewGroup?如果“是”,我将更新我的答案以解释它为什么有效@fanatic
  • @AliSheikhpour 没有。你问的很好。我只为removeView更改了它。我不得不做类似linearLayout=(LinearLayout)imageView.getParent(); ((ViewGroup)imageView.getParent()).removeView(imageView); linearLayout.addView(imageView,linearLayout.getChildCount());
猜你喜欢
  • 2019-07-25
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多