动态设置RelativeLayout.LayoutParams.addRule

时间:2014-05-14 13:16:25

标签: android listview dynamic relativelayout

我遇到这个问题,我有一个 相对布局 ,它有两个子相对布局(leftpanel和rightpanel)。它们位于listview项目的自定义布局中,每个项目都是从服务器的json响应中更新的。所以大小取决于服务器提供的内容。

问题:我希望每个面板的高度相互匹配,但似乎将 layout_height设置为match_parent不起作用 (实际上,如果这可以解决,那么没有更多的问题)。

我做了什么:我以编程方式将每个面板的顶部和底部对齐 - 如果另一个面板更大,则调整另一个面板,反之亦然。所以我做的是有一个视图(右侧面板)来监听rightPanel.getViewTreeObserver()。addOnScrollChangedListener(),并在每次滚动更改时调用下面的方法:

private void updateLayoutAlignmentParams(ViewHolder viewHolder) {
    RelativeLayout.LayoutParams leftPanelLayoutParams = (RelativeLayout.LayoutParams)viewHolder.leftPanel.getLayoutParams();
    RelativeLayout.LayoutParams rightPanelLayoutParams = (RelativeLayout.LayoutParams)viewHolder.rightPanel.getLayoutParams();
    int leftPanelHeight = viewHolder.leftPanel.getHeight();
    int rightPanelHeight = viewHolder.rightPanel.getHeight();
    if(leftPanelHeight > rightPanelHeight) {
        rightPanelLayoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, 0);
        rightPanelLayoutParams.addRule(RelativeLayout.ALIGN_TOP, 0);
        leftPanelLayoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, viewHolder.rightPanel.getId());
        leftPanelLayoutParams.addRule(RelativeLayout.ALIGN_TOP, viewHolder.rightPanel.getId());
    } else {
        leftPanelLayoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, 0);
        leftPanelLayoutParams.addRule(RelativeLayout.ALIGN_TOP, 0);
        rightPanelLayoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, viewHolder.leftPanel.getId());
        rightPanelLayoutParams.addRule(RelativeLayout.ALIGN_TOP, viewHolder.leftPanel.getId());

    }
}

会发生什么:滚动时并非所有视图都会更新;所以我得到一个单边的listview项目,其中一个比另一个更大,但有些调整得很好。奇怪的是,当物品离开视线时,它是偏斜的,然后得到一致的纠正。

注意:我也试过

  • addOnDrawListener() - 每个项目都已更新但我得到一个ArrayList超出范围的索引,但没有指向我的代码中的任何行。无论如何,这不是最好的解决方案,因为我需要支持API< 16.
  • setOnGlobalLayoutListener() - 什么都没发生。

如果你知道为什么或有更好的解决方案,请告诉我。

1 个答案:

答案 0 :(得分:1)

最后[kindof]修复了它!用以下代码替换整个方法:

   private void updateLayoutAlignmentParams(ViewHolder viewHolder) {
        viewHolder.rightPanel.setMinimumHeight(viewHolder.leftPanel.getHeight());
        viewHolder.leftPanel.setMinimumHeight(viewHolder.rightPanel.getHeight());
   }

虽然,我能够使用上面的代码实现左右面板彼此对齐。我现在遇到的问题是,当我切换视图时,前一个视图的高度和宽度会保留。 :(

修改 好的,我最终使用LinearLayout来包装整个listview项目。但是,不确定为什么RelativeLayout不符合match_parent。