筛选后Android ListView数组索引超出范围

筛选后Android ListView数组索引超出范围,android,listview,filter,android-arrayadapter,Android,Listview,Filter,Android Arrayadapter,我认为这是一个专家的问题 从ListView数据列表中,我可以调用position越界的getView()。 当我使用适配器过滤器时会发生这种情况。filterpublishResults()方法使用比原始列表小的筛选列表填充数据。 当新的筛选列表比以前的筛选列表短时,似乎会发生错误。 我更改了getView()的代码,以便在越界时返回一个伪convertView,只是为了查看发出了多少这样的调用 以下是相关代码和我记录的log消息: @Override public View

我认为这是一个专家的问题

从ListView数据列表中,我可以调用position越界的
getView()

当我使用适配器过滤器时会发生这种情况。filter
publishResults()
方法使用比原始列表小的筛选列表填充数据。
当新的筛选列表比以前的筛选列表短时,似乎会发生错误。 我更改了
getView()
的代码,以便在越界时返回一个伪convertView,只是为了查看发出了多少这样的调用

以下是相关代码和我记录的
log
消息:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // No logs here to keep ListView performance good
        Log.d(TAG, "+ getView( position=" + position + ")");
        ViewHolder holder;

        if( position >= mData.size() ) {
            // This code allows to see how many bad calls I get
            Log.w(TAG, "position out of bounds!");
            convertView = mInflater.inflate(mLayout, parent, false);
            return convertView;
        }

        . . . // Normal getView code

        return convertView;
    }
在过滤器中(按原样从
ArrayAdapter
源代码复制的代码)

您在这里看到的是,
publishResults()
方法确实将mData从7个项目的列表更改为3个项目的较短列表,请参见上面的代码,但是
Adapter
不断获取
getView()
调用7个项目列表,即使它不再存在。
请注意,已使用新的数据分配调用了
notifyDataSetChanged()
,因此
ListView
应该知道新列表。

似乎覆盖“getCount()”方法将解决您的问题:

@Override
public int getCount() {
    return mData.size();
}

在自定义列表视图适配器的
public int getCount()
方法中返回什么

您应该像
mData!=无效的mData.size():0

由于您返回的列表大小可能超过了列表中显示的数据,所以无法正常工作


自定义列表适配器的方法指定列表视图的大小,因此它应该是您在列表中传递的数据的大小

@Override
public int getCount() {

    if (isFiltered == true) {
        return myFilteredArray.size();
    }

    return myUnfilteredArray.size();
} 

正在调用getItemCount函数,如果是,它返回什么?如果您要覆盖它,请发布代码。getItemCount返回什么?我不会覆盖getItemCount,是吗?我想这是专家的问题。好笑@罗比尼奥那只意味着我不是专家。很高兴我能让你微笑。我修改了代码,到目前为止我再也没有越界。如果有人愿意发布答案,我会将其标记为已回答。非常感谢+1为此,此声明存在,但相同的问题您救了我一天!我完全忘了重写
getCount
方法
@Override
public int getCount() {
    return mData.size();
}
@Override
public int getCount() {

    if (isFiltered == true) {
        return myFilteredArray.size();
    }

    return myUnfilteredArray.size();
}