我有一个使用 CursorAdapter 的药物 ListView 。我的目标是当用户按下提交按钮时获取对所选项目的光标的引用,但我一直得到空值。这是我当前的代码:
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();
}
}
});
执行时,selectedMemination
始终为 null。我已经实现了一个可绘制的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);
}
});
这工作得很好,但是当我感兴趣的是最终选定的项目时,我觉得它执行了一堆毫无意义的操作。单击某个项目是否应该触发 mMespirationListView.onItemSelected()
?如果没有,采取什么措施来确保这种情况发生?
最佳答案
so I was under the impression that clicking the item was enough.
点击不是使用 ListView
进行选择。在以下情况之一将发生选择:
您以编程方式设置选择,或者
用户使用五向导航选项(例如方向键、轨迹球、箭头键)并按向上/向下按钮来移动突出显示栏
all I am interested in is the final selected item
ListView
默认情况下是一个命令小部件。当用户点击 ListView
中的一行时,您的应用应该执行某些操作,通常会在此过程中删除 ListView
。
如果,OTOH,用户正在选择某些内容,列表和选择仍保留在屏幕上(例如,主从模式、选择州/省作为填写地址的一部分) ,那么你应该使用选择模式。这可能是单选模式(通常用右边缘的单选按钮表示)、多选模式(通常用右边缘的复选框表示)或多选模式(通常用“激活”表示)状态设置持久突出显示,通常保留用于主从类型的场景)。
不要不要试图将“选择”重载为“选择”。听起来您正在将 ListView
呈现为更大的内容的一部分,用户正在其中做出选择,因此请使用选择模式。
关于java - 什么操作会触发 ListView 中的 onItemSelected?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28460731/