我在使用我创建的 ListView 时遇到了问题:我希望在单击某个项目时选中它。
我的代码如下:
protected void onResume() {
...
ListView lv = getListView();
lv.setOnItemSelectedListener(new OnItemSelectedListener()
{
public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) {
Log.v(TAG, "onItemSelected(..., " + pos + ",...) => selected: " + getSelectedItemPosition());
}
public void onNothingSelected(AdapterView<?> adapterView) {
Log.v(TAG, "onNothingSelected(...) => selected: " + getSelectedItemPosition());
}
});
lv.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {
lv.setSelection(pos);
Log.v(TAG, "onItemClick(..., " + pos + ",...) => selected: " + getSelectedItemPosition());
}
});
...
}
当我运行它并点击例如在第二项(即 pos=1)上,我得到:
04-03 23:08:36.994: V/DisplayLists(663): onItemClick(..., 1,...) => selected: -1
即即使使用正确的参数调用 OnItemClickListener 并调用 setSelection(1),也没有选择任何项目(因此也永远不会调用 OnItemSelectedListener.onItemSelected(...))并且 getSelectedItemPosition() 在 setSelection 之后仍然产生 -1 (1)-调用。
我错过了什么?
迈克尔
PS.: 我的列表确实有 >=2 个元素...
最佳答案
此处缺少的元素是 choiceMode
。这不是很好documented , 但默认情况下,android 中的 ListViews(以及从 AbsListView 继承的任何东西,如 GridView 等)不允许选择,但可以启用它 - 无论是在 XML 中还是在代码中:
在 XML 中:
<ListView
...
android:choiceMode="singleChoice" />
代码:
mListView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
请注意,一旦您执行此操作,android 将为您setSelection()
,因此您无需自己跟踪它。那时你的 onClickListener 只是为了保存选择,我什至不理会 OnSelectedItemListener :
@Override
public void onItemClick(final AdapterView<?> list, final View v,
final int position, final long id) {
Participant p = mAdapter.getParticipantForId(id);
eventManager.fire(new ParticipantSelectedEvent(p));
pxList.smoothScrollToPosition(position); // Make sure selection is plainly visible
}
关于安卓 ListView : how to select an item?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10002839/