簡體   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