AbsListView.java中的SetAdapter - Buggy还是我错过了什么?

时间:2014-07-16 18:35:36

标签: java android android-listview

我最近在我的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上找不到任何关于这个错误的信息

1 个答案:

答案 0 :(得分:1)

AbsListView不能直接使用,而是通过ListViewGridView等子类使用。

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

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

所以在这方面没有错误,但可以说闻起来有点滑稽。