我需要通过长按选择来访问ListView项目中的文本。对于旧的Android版本,我已使用下面的代码成功完成了上下文菜单。
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
String text = ((TextView) info.targetView).getText().toString();
switch (item.getItemId()) {
case R.id.getText:
getText(text);
return true;
default:
return super.onContextItemSelected(item);
}
}
但是,对于较新的Android版本,我想使用上下文操作栏执行此操作,但无法弄清楚如何在栏中选择项目后提取所选文本。以下代码不起作用。
myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
myListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
String text = ((TextView) info.targetView).getText().toString();
switch (item.getItemId()) {
case R.id.contextDelete:
getText(text);
return true;;
default:
return false;
}
}
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
return true;
}
//Other actionmode methods...
});
上下文操作栏显示确定,但是当从中选择一个项目时,我在AdapterContextMenuInfo行中得到一个NullPointerException,因为这显然是针对上下文菜单而不是操作栏。也许对于Action吧有一些相同的东西吗?或者,在这种情况下如何获取ListView项目文本?感谢。
答案 0 :(得分:11)
getCheckedItemPositions()
上的 ListView
将返回用户已检查的商品位置,如果您使用的是getCheckedItemIds()
,则CursorAdapter
将返回其ID值。
Here is a sample project演示了在API级别11+上使用CHOICE_MODE_MULTIPLE_MODAL
并回退到旧设备上下文菜单。
答案 1 :(得分:1)
我尝试在getCheckedItemIds()
对象上使用ListView
方法,但它没有返回任何内容(我没有使用Cursor
对象)。事实证明这是人们一直面临的常见问题。所以我想出了一个解决方法。在我的情况下,我不得不使用项目ID来创建通知(只是尝试一些示例代码)所以这就是我做的事情:
我创建了一个ArrayList
来存储所有已选择项目的ID。每次检查项目时,都会调用onItemCheckedStateChanged(..)
方法。我们可以使用此方法根据状态更改更新ID的ArrayList
。然后,当用户选择一个选项并调用onActionItemClicked()
方法时,我们可以使用此列表中存储的ID。这是代码:
lv.setMultiChoiceModeListener(new MultiChoiceModeListener() {
private ArrayList<Long> checkedIds = new ArrayList<Long>();
//Code omitted for brevity
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
menu.add(0, 1, 0, R.string.context_create_notification);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId()){
case 1:
for(long id : checkedIds){
createNotification(id+1);
}
mode.finish();
break;
}
return true;
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
if(checked){
checkedIds.add(id);
} else{
Iterator<Long> iter = checkedIds.iterator();
while(iter.hasNext()){
long stored = (Long) iter.next();
if(stored == id){
iter.remove();
}
}
}
}
});