java - BaseAdapter 的 RelativeLayout addRule 不能很好地工作
问题描述
在将规则之一添加到RelativeLayout 后,我得到了一个不太正确的结果。ID 不适用于元素/应用不正确。这会影响必须绑定到小部件的规则。
作为一个容器,我使用 ListView 并通过 BaseAdapter 向其中添加对象。这显然不会给出期望的结果,但是在重用返回到适配器并重用的相同小部件后(保证元素不会再次更改),规则开始正常工作。
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
ListView view = new ListView(this);
view.setBackgroundColor(Color.BLACK);
view.setId("files_list".hashCode());
view.setAdapter(new TestAdapter(this));
...
private class TestAdapter extends BaseAdapter {
...
@Override
public View getView(int position, View convertView, View parent) {
if(convertView == null) convertView = inflateView();
// only changes text & pictures, doesn't affecting display
manipulateItem(position, convertView);
return convertView;
...
private View inflateView() {
RelativeLayout layout = new RelativeLayout(context);
layout.setLayoutParams(new ViewGroup.LayoutParams(-1, -2));
ImageView icon = new ImageView(context);
icon.setBackgroundColor(Color.BLACK);
icon.setPadding(20, 20, 20, 20);
icon.setId("file_icon".hashCode());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(110, -1);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.rightMargin = 30;
layout.addView(icon, params);
...
LinearLayout additional = new LinearLayout(context);
additional.setOrientation(LinearLayout.VERTICAL);
additional.setGravity(Gravity.RIGHT);
additional.setBackgroundColor(Color.RED);
additional.setPadding(30, 0, 30, 0);
additional.setId(java.lang.String("additional_info").hashCode());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(-2, -2);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(additional, params);
...
LinearLayout uniqal = new LinearLayout(context);
uniqal.setOrientation(LinearLayout.VERTICAL);
uniqal.setBackgroundColor(Color.BLUE);
uniqal.setId("uniqal_info".hashCode());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(-2, -2);
// problem occurs here
params.addRule(RelativeLayout.LEFT_OF, additional.getId());
params.addRule(RelativeLayout.RIGHT_OF, icon.getId());
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(uniqal, params);
...
return layout;
}
这是第一次滚动后小部件的外观:第一个绘图屏幕后的元素
因此,在滚动和重用相同的小部件之后:工作屏幕
在第一次使用 5 次后(我的测试屏幕上有这么多),一切都变得很好。第一次,视图不希望以任何方式通过 ID 附加到另一个小部件。有没有解决的办法?
从应用程序 .xml 扩展布局的选项不适合我
解决方案
手动更新布局对我有帮助,但这并不能立即奏效,我的问题仍然相关。这是修改后的 inflateView 代码:
private View inflateView() {
...
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(-2, -2);
params.addRule(RelativeLayout.LEFT_OF, additional.getId());
params.addRule(RelativeLayout.RIGHT_OF, icon.getId());
params.addRule(RelativeLayout.CENTER_IN_PARENT);
uniqal.post(new Runnable() {
public void run() {
uniqal.requestLayout();
}
});
layout.addView(uniqal, params);
...
return layout;
}
推荐阅读
- javascript - 如何检查道具中的元素是否匹配条件?
- python - 使用scrapy下载内容并保存到列表中
- latex - Doxygen LaTeX 输出段落缩进
- symfony - 我在部署到生产后清除了缓存,但也丢失了我的应用程序缓存。如何在看到新的 symfony 代码更新时排除我的池?
- php - 可以使用 PHP 睡眠功能来减轻 bot 流量吗?
- java - Hibernate & Spring - org.hibernate.PropertyAccessException:无法通过反射设置字段值 [1] 值
- javascript - 从字符串中分离整数和小数
- node.js - 查找属于(父)类别的英语单词含义的算法
- python - Pyspark - groupby([col list]).agg(count([col list))
- c++ - 基本算法运行时间Big O()计算题