下面是一个带有ListView的代码片段。我添加了一个emptyView和一个headerView。添加headerView会导致onItemClick中的位置增加一个。
所以没有headerView,第一个列表元素的位置为0,headerView第一个列表元素的位置为1!
这导致我的适配器出错,例如在调用getItem()并使用其他一些方法时,请参阅下文。 奇怪的是:在适配器的getView()方法中,即使添加了headerView,也会请求第一个列表元素,位置为0!
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时的正常行为吗?以及如何克服我的适配器中的问题?
答案 0 :(得分:112)
我刚遇到此问题,最好的方式似乎是使用ListView.getItemAtPosition(position)
代替ListAdapter.getItem(position)
作为标题的ListView
版本帐户,即: -
请改为:
myListView.getItemAtPosition(position)
答案 1 :(得分:31)
如果您不关心点击标题,请从该位置减去标题视图的数量以获取适配器的位置:
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);
}
});
答案 2 :(得分:27)
如果您向ListView
添加标题,该标题将成为列表中的第一项。您可以通过覆盖getCount()
以减少一项来补偿这一点,但确保您处理getItem()
,getItemId()
等等,因为标题将是位置0中的项目。 / p>
答案 3 :(得分:14)
实施AdapterView.OnItemClickListener
时,我们只是从位置中减去标题。
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
position -= mListView.getHeaderViewsCount();
// what ever else follows...
}
答案 4 :(得分:13)
无需更改任何代码。只需使用下面的代码。
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
parent.getAdapter().getItem(position);
//Do something with it
}
});
答案 5 :(得分:9)
请勿使用适配器,请使用getAdapter中的“装饰”适配器。
答案 6 :(得分:5)
对此的一个解决方案是将id映射到索引。基本上make id返回列表中的索引,点击监听器将执行:
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listAdapter.getItem((int) id);
}
答案 7 :(得分:3)
您好我们可以通过这种方式解决这个问题 首先,在注入列表后创建标题视图,最后一步无法使用setOnClickListener。它适合我。任何反馈欢迎
ViewGroup headerView = (ViewGroup) getLayoutInflater().inflate(R.layout.your_header, list,false);
list.addHeaderView(headerView);
headerView.setEnabled(false);
headerView.setOnClickListener(null);
答案 8 :(得分:0)
不要添加@Ramesh没有添加的新内容,而是添加一些额外的上下文:
personList.setOnItemClickListener(new OnItemClickListener() {
@SuppressWarnings("unchecked")
public void onItemClick( AdapterView<?> parent, View view, int position, long duration) {
Map<String, Object> person = (Map<String, Object>) parent.getAdapter().getItem(position);
if (person != null){
// If the header was clicked on a null is returned
OnPersonUiChangeListener listener = (OnPersonUiChangeListener) getActivity();
listener.onSelectedPersonChanged(person);
}
}
});
答案 9 :(得分:0)
使用getSelectedItemPosition()返回适配器数据集中当前所选项的位置。 这种方法不需要担心页眉或页脚的大小。
答案 10 :(得分:0)
这可能有助于某人,改进Farid_z和Philipp的答案,我们可以正确地应用setItemChecked和setTitle这样的东西
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
position += 1;
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
position -= 1;
setTitle(mNavigationDrawerItemTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);