Android ListView:如何选择项目?

mmo*_*mmo 3 android android-widget android-listview

我在使用我创建的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());              
    }
});
...
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个并点击例如第二个项目(即pos = 1)时,我得到:

04-03 23:08:36.994: V/DisplayLists(663): onItemClick(..., 1,...) => selected: -1
Run Code Online (Sandbox Code Playgroud)

即使使用正确的参数调用OnItemClickListener并调用setSelection(1),也没有选择任何项(因此也永远不会调用OnItemSelectedListener.onItemSelected(...))并且getSelectedItemPosition()仍然产生-1为setSelection(1)-call.

我错过了什么?

迈克尔

PS.:我的清单确实有> = 2个元素......

JRa*_*ond 8

这里缺少的元素是choiceMode.这个文档并没有很好的记录,但是默认情况下,Android中的ListViews(以及扩展名,任何继承自AbsListView的内容,如GridView等)不允许选择,但可以在XML或代码中启用它:

在XML中:

<ListView
  ...
  android:choiceMode="singleChoice" />
Run Code Online (Sandbox Code Playgroud)

码:

mListView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
Run Code Online (Sandbox Code Playgroud)

请注意,一旦你这样做,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
}
Run Code Online (Sandbox Code Playgroud)

  • 这究竟是为什么会这样呢?它解决了getSelectedItemPosition()永远不会改变的海报问题.是的,如果他想要的是所讨论的项目,那么onItemClick()中的getItemAtPosition肯定更容易.然而,choiceMode能够**显示用户当前选择的项目,以及让程序员访问它. (2认同)