Android 动态设置RelativeLayout.LayoutParams.addRule

Android 动态设置RelativeLayout.LayoutParams.addRule,android,listview,dynamic,android-relativelayout,Android,Listview,Dynamic,Android Relativelayout,我有一个相对布局,它有两个子相对布局(leftpanel和rightpanel)。它们位于listview项的自定义布局中,每个项都从服务器的json响应更新。因此大小取决于服务器提供的内容 问题:我想让每个面板的高度相互匹配,但将布局高度设置为匹配父级似乎不起作用(实际上,如果这可以解决,那么就没有问题了) 我所做的:我通过编程将每个面板的顶部和底部彼此对齐——如果另一个面板较大,则调整另一个面板,反之亦然。因此,我所做的是使用一个视图(rightpanel)来侦听rightpanel.get

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

问题:我想让每个面板的高度相互匹配,但将布局高度设置为匹配父级似乎不起作用(实际上,如果这可以解决,那么就没有问题了)

我所做的:我通过编程将每个面板的顶部和底部彼此对齐——如果另一个面板较大,则调整另一个面板,反之亦然。因此,我所做的是使用一个视图(rightpanel)来侦听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()-什么都不会发生

如果您知道原因或有更好的解决方案,请告诉我。

终于[有点]解决了!将整个方法替换为以下代码:

   private void updateLayoutAlignmentParams(ViewHolder viewHolder) {
        viewHolder.rightPanel.setMinimumHeight(viewHolder.leftPanel.getHeight());
        viewHolder.leftPanel.setMinimumHeight(viewHolder.rightPanel.getHeight());
   }
尽管如此,我还是能够使用上面的代码使左右面板相互对齐。我现在遇到了切换视图时保留上一视图的高度和宽度的问题:(

编辑:
好的,我最终使用LinearLayout来包装整个listview项。不过,我不太确定RelativeLayout为什么不符合match_parent的要求。

是否尝试对面板对象调用invalidate()(invalidate()或postInvalidate()计划重新绘制组件)我没有:(但你的意思是在滚动更改侦听器上同时对leftPanel和rightPanel进行invidate吗?如果rightPanel的文本更新,我会调用leftPanel.invalidate(),反之亦然。(我假设在内容更新后面板会自动重新绘制)显然不起作用。不确定getHeight()是否方法正在获取正确的值。嗯……AFAIK getHeight()只返回“预期”高度。getMeasuredHeight()返回在布局/绘图期间测量的高度。我只是不确定在布局相关方法之外调用此方法时是否返回有效数据。