繁体   English   中英

BaseAdapter 的 RelativeLayout addRule 不能很好地工作

[英]RelativeLayout addRule at BaseAdapter doesn't work very well

在将规则之一添加到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 附加到另一个小部件。 有没有解决的办法?

从 application.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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM