下面是一个带有ListView的代码片段。我添加了一个emptyView和一个headerView。添加headerView会导致onItemClick中的位置增加1。
因此,如果没有headerView,第一个列表元素的位置将为0,而使用headerView时,第一个列表元素的位置将为1!
这会在我的适配器中导致错误,例如在调用getItem()和使用其他一些方法时,请参见下面的内容。奇怪的是:在适配器的getView()方法中,请求的第一个列表元素的位置为0,即使添加了headerView!!
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ListView list = (ListView) viewSwitcher.findViewById(R.id.list);
View emptyView = viewSwitcher.findViewById(R.id.empty);
list.setEmptyView(emptyView);
View sectionHeading = inflater.inflate(R.layout.heading, list, false);
TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);
sectionHeadingTextView.setText(headerText);
list.addHeaderView(sectionHeading);
list.setAdapter(listAdapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listAdapter.getItem(position);
//Do something with it
}
});
}
一些适配器方法:
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
@Override
public int getItemViewType(int position) {
return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED;
}
@Override
public Product getItem(int position) {
return items.get(position);
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return (position < items.size());
}
这是添加headerView时的正常行为吗?如何克服我的适配器中的问题?
发布于 2012-11-16 00:56:12
我刚刚遇到了这个问题,最好的方法似乎是使用ListView.getItemAtPosition(position)
而不是ListAdapter.getItem(position)
,因为ListView
版本说明了标题,即:
改为执行以下操作:
myListView.getItemAtPosition(position)
发布于 2013-04-17 22:10:33
如果你不关心点击标题,从位置减去标题视图的数量,就可以得到适配器的位置:
listView.addHeaderView(inflater.inflate(
R.layout.my_hdr_layout, null), null, false);
listView.setAdapter(m_adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
position -= listView.getHeaderViewsCount();
final MyObject object = m_adapter.getItem(position);
}
});
发布于 2012-06-20 01:55:31
如果将标头添加到ListView
,则它将成为列表中的第一项。您可以通过覆盖getCount()
以少返回一个项来弥补这一点,但请确保处理getItem()
、getItemId()
等,因为标头将是位置0中的项。
https://stackoverflow.com/questions/11106397
复制相似问题