我最近在我的ListView中从AbsListView扩展了一个nullpointer异常(调用showContextMenuForChild)。我在我的网站上找不到错误,所以我查看了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试图调用空的mAdapter。他们忘记在这个课程中设置适配器了吗?这不可能是真的,因为很多人都会看到这个,我在stackoverflow上找不到任何关于这个错误的信息
答案 0 :(得分:1)
AbsListView
不能直接使用,而是通过ListView
或GridView
等子类使用。
setAdapter()
的子类实现设置mAdapter
,然后才调用super.setAdapter()
。
供参考,这是link to ListView.setAdapter()
source。您可以看到它与AbsListView
一起使用的方式。
所以在这方面没有错误,但可以说闻起来有点滑稽。