我正在尝试实现我自己的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
自定义实现的任何示例。
提前致谢。
答案 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);