我最近在ListView中得到了一个nullpointer-exception(调用showContextMenuForChild),该异常是AbsListView的扩展。我在我的网站上找不到错误,所以我调查了AbsListView的源代码以找到其背后的原因。
setAdapter方法对我来说似乎有点奇怪:
/**
* {@inheritDoc}
*/
@Override
public void setAdapter(ListAdapter adapter) {
if (adapter != null) {
mAdapterHasStableIds = mAdapter.hasStableIds();
if (mChoiceMode != CHOICE_MODE_NONE && mAdapterHasStableIds &&
mCheckedIdStates == null) {
mCheckedIdStates = new LongSparseArray<Integer>();
}
}
if (mCheckStates != null) {
mCheckStates.clear();
}
if (mCheckedIdStates != null) {
mCheckedIdStates.clear();
}
}
为什么此方法根本不使用适配器?有趣的是,我的“错误”是AbsListView尝试调用null的mAdapter。他们是否忘记在此类中设置适配器?这是不正确的,因为这会被很多人看到,而且我在stackoverflow上找不到任何有关此错误的信息
最佳答案
AbsListView
不能直接使用,而是通过诸如ListView
或GridView
的子类使用。setAdapter()
的子类实现设置mAdapter
,然后才调用super.setAdapter()
。
供参考,这里是link to ListView.setAdapter()
source。您可以看到它与AbsListView
一起工作的方式。
因此,这在这方面不是越野车,但可以说闻起来有些有趣。