调用`invalidate`时,自定义android视图不会更新

时间:2013-10-29 02:32:32

标签: android android-view

我正在尝试为分页创建自定义视图。

这是代码:

public class PagerView extends LinearLayout {
    private Button mPrevButton;
    private Button mNextButton;
    private TextView mInformationTextView;

    public PagerView(Context context) {
        this(context, null);
    }

    public PagerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.initChild(context, attrs);
    }

    private void initChild(Context context, AttributeSet attrs) {
        this.setOrientation(LinearLayout.HORIZONTAL);
        this.setVisibility(GONE);

        mPrevButton = new Button(context);
        mPrevButton.setText("Prev");

        mNextButton = new Button(context);
        mNextButton.setText("Next");

        mInformationTextView = new TextView(context);
        mInformationTextView.setText("");

        addView(mPrevButton);
        addView(mInformationTextView);
        addView(mNextButton);
    }


    public void setPageInformation(int page, int totalPage) {
        if (page >= 1 && totalPage >= 1) {
            this.setVisibility(VISIBLE);
            if (totalPage > 1) {
                mInformationTextView.setText(page + "/" + totalPage);

                mPrevButton.setEnabled(page != 1);
                mNextButton.setEnabled(page != totalPage);
            }
        } else
            this.setVisibility(GONE);
        postInvalidate();
    }
}

来电者:

public class PoiListActivity extends ActionBarActivity  {

    private ListView mListView;
    private PagerView mPageBar;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.poi_result_layout);

    setupListView();

    PoiResult poiResult = (PoiResult) GlobalState.getInstance().get(IConstant.Search_Result);
    if (poiResult != null) {
        refreshListView(poiResult);
    }
}

private void refreshListView(PoiResult poiResult) {
    mPageBar.setPageInformation(1, 3);

    mAdapterItems.clear();
    mAdapterItems.addAll(poiResult.poiList);
    mAdapter.notifyDataSetChanged();
}

private void setupListView() {
    mPageBar = new PagerView(this, this);

    mListView = (ListView) findViewById(R.id.poiList);
    mListView.addFooterView(mPageBar);

    mAdapter = new PoiInfoAdapter(this, R.layout.poi_result_item, mAdapterItems);
    mListView.setAdapter(mAdapter);
}
}

但是我有两个问题:

1页面视图永远不会显示。

然后我尝试评论该行

this.setVisibility(GONE);  // set it unvisible when inited

然后页面栏显示,但mInformationTextView的文本仍为空,并且mPrevButton已启用(由于页面为1,因此应取消启用)。

我设置页面信息后调用了postInvalidate();,但为什么它没有按预期工作?

2即使是pageView显示,如何使mPrevButton mNextButtonmInformationTextView中心对齐?

1 个答案:

答案 0 :(得分:1)

根据您提供的代码,您无需手动使视图层次结构的任何部分无效。尽管您已创建自定义视图,但您仍然只修改现有视图属性(例如可见性),并且这些视图在发生这些更改时将自动失效。

您无法看到该视图的原因是您已将其添加为ListView的页脚视图,但尚未设置适配器。使用ListView时,页眉/页脚会添加到您通过setAdapter()提供的任何适配器实现中,并作为列表项内容的一部分绘制。没有列表适配器(即使它当前是空的),没有视图。因此,最好立即在列表中设置适配器,并在列表数据更改时更新它,而不是等待列表数据设置适配器。