StickyGridHeaders自定义适配器

时间:2013-07-15 05:39:40

标签: android gridview adapter

我正在尝试实现我自己的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() OnItemClickListener投射到我的 ModeAdapter 课程中。

如果我想在此致电notifyDataSetChanged()怎么办? 我在这里找不到StickyGridHeadersBaseAdapter自定义实现的任何示例。

提前致谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

获取项目的更简单方法是:

StickyGridHeadersBaseAdapterWrapper wrapper = (StickyGridHeadersBaseAdapterWrapper) parent.getAdapter();
Mode item = (Mode ) wrapper.getWrappedAdapter().getItem(position);