0

我正在尝试实现我自己的StickyGridHeadersBaseAdapter,我当前的源代码在这里 - http://paste.org.ru/?11jrjh,我像使用它一样

ModeAdapter adapter = new ModeAdapter(this);
modeGridView.setAdapter(adapter);

我遇到的问题是

1) 我不知道如何为此适配器调用 notifyDataSetChanged(),所以我无法更改项目

2) AdapterView.OnItemClickListener ( http://paste.org.ru/?mvgt7b ) 的实现很奇怪

Mode mode = (Mode) adapter.getItem(position);

对于第 1 和第 2 位置的项目返回 null,第 3 位置的项目是适配器中的实际第 1 项目。

我的错在哪里?

还有一个问题是为什么我不能adapterView.getAdapter()在我OnItemClickListenerModeAdapter类中加入。

如果我想在notifyDataSetChanged()这里打电话怎么办?我没有找到任何自定义实现StickyGridHeadersBaseAdapterhere的示例。

提前致谢。

4

2 回答 2

1

获取物品的更简单方法是:

StickyGridHeadersBaseAdapterWrapper wrapper = (StickyGridHeadersBaseAdapterWrapper) parent.getAdapter();
Mode item = (Mode ) wrapper.getWrappedAdapter().getItem(position);
于 2014-03-26T18:58:17.100 回答
1

我和你有同样的问题2):

在第一个标题之后,我得到了上一行的项目,在第二个标题之后,我得到了两行的项目,等等......

原因如下:

StickyHeadersGridView:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    mOnItemClickListener.onItemClick(parent, view, mAdapter.translatePosition(position).mPosition, id);
}

位置得到纠正。所以在你的 onItemClick 中你得到了位置的正确值。

如果您要求该项目:Mode mode = (Mode) adapter.getItem(position); 您得到StickyGridHeadersBaseAdapterWrapper.getItem(int pos)

@Override
public Object getItem(int position) throws ArrayIndexOutOfBoundsException {
    Position adapterPosition = translatePosition(position);
    if (adapterPosition.mPosition == POSITION_FILLER || adapterPosition.mPosition == POSITION_HEADER) {
        // Fake entry in view.
        return null;
    }
    return mDelegate.getItem(adapterPosition.mPosition);
}

位置被第二次纠正,StickyGridHeadersBaseAdapterWrapper.getItem()导致退回错误的物品......

我添加了一个解决方法:

在 StickyHeadersBaseAdapterWrapper 中,我添加了:

public Object getItemAtDelegatePosition(int pos) {
    return mDelegate.getItem(pos);
}

我在 onItemClick 中使用它:

Mode item = (Mode) ((StickyGridHeadersBaseAdapterWrapper)parent.getAdapter()).getItemAtDelegatePosition(position);
于 2013-08-14T11:26:03.360 回答