【问题标题】:SetAdapter in AbsListView.java - Buggy or am I missing something?AbsListView.java 中的 SetAdapter - Buggy 还是我遗漏了什么?
【发布时间】:2014-07-17 02:40:39
【问题描述】:

我最近在从 AbsListView 扩展的 ListView 中遇到了一个空指针异常(调用 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 上找不到有关此错误的任何信息

【问题讨论】:

    标签: java android android-listview


    【解决方案1】:

    AbsListView 不打算直接使用,而是通过诸如ListView 或GridView 之类的子类来使用。

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

    作为参考,这里有一个link to ListView.setAdapter() source。你可以看看它是如何与AbsListView一起工作的。

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

    【讨论】:

    • 非常感谢...你是对的,子类设置了适配器。但基本上如果你从这个类扩展并且你没有设置这个值你会遇到问题......不是最干净的代码;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2012-02-07
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多