监听器在视图刷新后收到通知

时间:2011-08-14 22:07:12

标签: android android-layout

我的项目到目前为止只包含一个Activity,它加载由扩展BaseAdapter填充的GridView。 通常,通过从我的一个OnClickListener对象调用BaseAdapter.notifyDataSetChanged()来刷新视图。

我的问题是每次刷新视图时我都需要启动一个计时器。我只想在完全重新加载视图时执行此操作。

我似乎无法找到我可以在View或Adapter API中覆盖的侦听器或方法来执行此操作,尽管我认为有一个。 我发现的最接近的是BaseAdapter.registerDataSetObserver,虽然我不确定这是我正在寻找的。

有人可以提出建议吗?

由于

2 个答案:

答案 0 :(得分:1)

DataSetObserver不会提供您正在寻找的功能。在适配器中尝试查看getView()或ViewBinder.setViewBinder()(对于Simple...Adapter类)一旦最后一个视图填充了您将能够知道的数据,大致是在完成时。< / p>

答案 1 :(得分:0)

我想说你最好的选择是从这个类创建一个anon内部类,并在GridView的扩展名中添加你的计时器逻辑:

class AdapterDataSetObserver extends DataSetObserver {

    @Override
    public void onChanged() {

    }

    @Override
    public void onInvalidated() {

    }
}

(您可以访问此成员变量,因为它不是priveate):

/**
 * Should be used by subclasses to listen to changes in the dataset
 */
AdapterDataSetObserver mDataSetObserver;

这是您应该覆盖的方法(在gridview内)(您可能需要进行一些修改,因为其中一些成员变量可能是私有的 - mDataSetObserver不是:

@Override
public void setAdapter(ListAdapter adapter) {
    if (null != mAdapter) {
        mAdapter.unregisterDataSetObserver(mDataSetObserver);
    }

    resetList();
    mRecycler.clear();
    mAdapter = adapter;

    mOldSelectedPosition = INVALID_POSITION;
    mOldSelectedRowId = INVALID_ROW_ID;

    if (mAdapter != null) {
        mOldItemCount = mItemCount;
        mItemCount = mAdapter.getCount();
        mDataChanged = true;
        checkFocus();

        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);

        mRecycler.setViewTypeCount(mAdapter.getViewTypeCount());

        int position;
        if (mStackFromBottom) {
            position = lookForSelectablePosition(mItemCount - 1, false);
        } else {
            position = lookForSelectablePosition(0, true);
        }
        setSelectedPositionInt(position);
        setNextSelectedPositionInt(position);
        checkSelectionChanged();
    } else {
        checkFocus();
        // Nothing selected
        checkSelectionChanged();
    }

    requestLayout();
} 

在上面的方法中查找这两行并在此处扩展您的类:

        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);