Android 动态设置RelativeLayout.LayoutParams.addRule
我有一个相对布局,它有两个子相对布局(leftpanel和rightpanel)。它们位于listview项的自定义布局中,每个项都从服务器的json响应更新。因此大小取决于服务器提供的内容 问题:我想让每个面板的高度相互匹配,但将布局高度设置为匹配父级似乎不起作用(实际上,如果这可以解决,那么就没有问题了) 我所做的:我通过编程将每个面板的顶部和底部彼此对齐——如果另一个面板较大,则调整另一个面板,反之亦然。因此,我所做的是使用一个视图(rightpanel)来侦听rightpanel.getViewTreeObserver().addOnScrollChangedListener(),并在每次滚动更改时调用下面的方法:Android 动态设置RelativeLayout.LayoutParams.addRule,android,listview,dynamic,android-relativelayout,Android,Listview,Dynamic,Android Relativelayout,我有一个相对布局,它有两个子相对布局(leftpanel和rightpanel)。它们位于listview项的自定义布局中,每个项都从服务器的json响应更新。因此大小取决于服务器提供的内容 问题:我想让每个面板的高度相互匹配,但将布局高度设置为匹配父级似乎不起作用(实际上,如果这可以解决,那么就没有问题了) 我所做的:我通过编程将每个面板的顶部和底部彼此对齐——如果另一个面板较大,则调整另一个面板,反之亦然。因此,我所做的是使用一个视图(rightpanel)来侦听rightpanel.get
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()返回在布局/绘图期间测量的高度。我只是不确定在布局相关方法之外调用此方法时是否返回有效数据。