Android 视图刷新后将通知侦听器

Android 视图刷新后将通知侦听器,android,android-layout,Android,Android Layout,到目前为止,我的项目由单个活动组成,该活动加载由扩展BaseAdapter填充的GridView。 通常,通过从我的OnClickListener对象之一调用BaseAdapter.notifyDataSetChanged()来刷新视图 我的问题是每次刷新视图时都需要启动计时器。我只想在视图完全重新加载后执行此操作 我似乎找不到一个可以在视图或适配器API中重写以执行此操作的侦听器或方法,尽管我假定有一个侦听器或方法。 我找到的最接近的是BaseAdapter.registerDataSetOb

到目前为止,我的项目由单个活动组成,该活动加载由扩展BaseAdapter填充的GridView。 通常,通过从我的OnClickListener对象之一调用BaseAdapter.notifyDataSetChanged()来刷新视图

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

我似乎找不到一个可以在视图或适配器API中重写以执行此操作的侦听器或方法,尽管我假定有一个侦听器或方法。 我找到的最接近的是BaseAdapter.registerDataSetObserver,尽管我也不确定这是否是我想要的

有人能给我建议吗


谢谢

DataSetoObserver不会提供您正在寻找的功能。在适配器中,尝试查看或查看ViewBinder.setViewBinder()(对于
Simple…adapter
类),一旦最后一个视图中填充了您可以大致了解的数据,完成后。

我认为最好的办法是从该类创建一个非内部类,并将计时器逻辑添加到
GridView
的扩展中:

class AdapterDataSetObserver extends DataSetObserver {

    @Override
    public void onChanged() {

    }

    @Override
    public void onInvalidated() {

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

这是您应该覆盖的方法(在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);

谢谢,我不确定我是否理解ViewBinder的概念…SimpleAdapter的句柄在哪里,或者它在我上面概述的类中的位置如何?它是自定义BaseAdapter还是API BaseAdapter?这是我扩展的BaseAdapter,这可能意味着您在getView中进行绑定,只需等待填充最后一个视图,然后启动计时器。好的,我会试试看,虽然看起来有点像“黑客”。谢谢你的建议,谢谢你的回复,但我不确定我是否理解覆盖setAdapter的必要性……为什么我需要这样做?
        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);