什么动作触发 ListView 中的 onItemSelected?

What action triggers onItemSelected in a ListView?

我有一个使用 CursorAdapter 的药物列表视图。我的目标是在用户按下提交按钮时获取对所选项目的 Cursor 的引用,但我一直得到空值。这是我当前的代码:

mSubmitButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Cursor selectedMedication = (Cursor) mMedicationListView.getSelectedItem();
        if(selectedMedication != null)
        {
            MedicationSelectionListener activity = (MedicationSelectionListener) getActivity();
            activity.onMedicationSelected(new Medication(selectedMedication));
        } else{
            Toast.makeText(getActivity(), "Must select a medication.", Toast.LENGTH_SHORT).show();
        }
    }
});

执行此操作时,selectedMedication 始终为空。我已经实现了一个可绘制的 selector.xml 文件,当它被按下时它会改变项目的背景颜色,并且工作正常,所以我的印象是点击该项目就足够了。

我还尝试了以下方法,每次单击项目时都设置所选药物变量:

mMedicationListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Cursor c = (Cursor) mMedicationListView.getItemAtPosition(position);
        if(c.moveToFirst())
            mSelectedMedication = new Medication(c);
    }
});

这很好用,但是当我只对最终选择的项目感兴趣时,我觉得它执行了一堆毫无意义的操作。单击项目是否应该触发 mMedicationListView.onItemSelected()?如果没有,采取什么行动来确保发生这种情况?

so I was under the impression that clicking the item was enough.

单击不是带有 ListView 的选择。选择将在以下任一时间发生:

  • 您以编程方式设置选择,或者

  • 用户使用五向导航选项(例如,方向键、轨迹球、箭头键)并在其上按 up/down 以移动高亮栏

all I am interested in is the final selected item

默认情况下,ListView 是命令小部件。当用户点击 ListView 中的一行时,您的应用程序应该开始执行某些操作,通常会一路摆脱 ListView

如果,OTOH,用户正在选择 某物,其中列表和选择保留在屏幕上(例如,主从模式,选择 state/province 作为填写地址的一部分),那么你应该使用选择模式。这可能是单选模式(通常用右边缘下方的单选按钮表示)、多选模式(通常用右边缘下方的复选框表示)或多选模式模式(通常用 "activated" state 设置一个持久的高亮,通常保留用于主要细节类型的场景)。

不要不要尝试重载"selection"来表示"choice"。听起来您正在将 ListView 作为更大内容的一部分呈现,用户正在其中做出选择,因此请为此使用选择模式。