我的项目到目前为止只包含一个Activity,它加载由扩展BaseAdapter填充的GridView。 通常,通过从我的一个OnClickListener对象调用BaseAdapter.notifyDataSetChanged()来刷新视图。
我的问题是每次刷新视图时我都需要启动一个计时器。我只想在完全重新加载视图时执行此操作。
我似乎无法找到我可以在View或Adapter API中覆盖的侦听器或方法来执行此操作,尽管我认为有一个。 我发现的最接近的是BaseAdapter.registerDataSetObserver,虽然我不确定这是我正在寻找的。 p>
有人可以提出建议吗?
由于
答案 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);