我最近在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不能直接使用,而是通过诸如ListViewGridView的子类使用。

setAdapter()的子类实现设置mAdapter,然后才调用super.setAdapter()

供参考,这里是link to ListView.setAdapter() source。您可以看到它与AbsListView一起工作的方式。

因此,这在这方面不是越野车,但可以说闻起来有些有趣。

08-05 17:01