Jer*_*gan 56 android listview contextmenu
我有一个ListView,允许用户长按项目以获取上下文菜单.我遇到的问题是确定ListItem
他们长期压迫的问题.我试过这样做:
myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override public void onCreateContextMenu(ContextMenu menu, final View v, ContextMenuInfo menuInfo) {
menu.add("Make Toast")
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override public boolean onMenuItemClick(MenuItem item) {
String toastText = "You clicked position " + ((ListView)v).getSelectedItemPosition();
Toast.makeText(DisplayScheduleActivity.this, toastText, Toast.LENGTH_SHORT).show();
return true;
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
但它只是挂起,直到ANR弹出.我怀疑创建菜单后ListItem
不再选择.
看起来您可以监控点击或长按,然后在那里记录点击的项目:
mArrivalsList.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
// record position/id/whatever here
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
但这对我来说感觉很重要.有没有人有更好的解决方案呢?
Eri*_*rke 75
我这样做.在我的onCreateContextMenu(...)
方法中,我将其转换ContextMenu.ContextMenuInfo
为AdapterView.AdapterContextMenuInfo
.从那里,您可以获得targetView,再次将其投射到窗口小部件.完整的代码在HomeActivity.java中可用,查找onCreateContextMenu(...)
方法.
@Override
public void onCreateContextMenu(ContextMenu contextMenu,
View v,
ContextMenu.ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) menuInfo;
selectedWord = ((TextView) info.targetView).getText().toString();
selectedWordId = info.id;
contextMenu.setHeaderTitle(selectedWord);
contextMenu.add(0, CONTEXT_MENU_EDIT_ITEM, 0, R.string.edit);
contextMenu.add(0, CONTEXT_MENU_DELETE_ITEM, 1, R.string.delete);
}
Run Code Online (Sandbox Code Playgroud)
请注意,我将所选文本以及选择ID存储在私有字段中.由于UI是线程限制的,我知道selectedWord和selectedWordId字段对于以后的操作是正确的.
Dan*_*Lew 67
首先,我想知道你是否通过使用使事情变得过于复杂View.setOnCreateContextMenuListener()
.如果您使用Activity.registerForContextMenu()
,事情会变得更加容易,因为您可以使用Activity.onCreateContextMenu()
和Activity.onContextItemSelected()
处理所有菜单事件.它基本上意味着您不必定义所有这些匿名内部类来处理每个事件; 您只需要覆盖一些Activity方法来处理这些上下文菜单事件.
其次,检索当前所选项目的方法肯定更简单.您需要做的就是保持ListView
对Adapter
用于填充它的或使用的引用.您可以使用ContextMenuInfo作为AdapterContextMenuInfo来获取项目的位置; 然后你可以使用ListView.getItemAtPosition()
或Adapter.getItem()
检索Object
专门链接到被点击的内容.例如,假设我正在使用Activity.onCreateContextMenu()
,我可以这样做:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// Get the info on which item was selected
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
// Get the Adapter behind your ListView (this assumes you're using
// a ListActivity; if you're not, you'll have to store the Adapter yourself
// in some way that can be accessed here.)
Adapter adapter = getListAdapter();
// Retrieve the item that was clicked on
Object item = adapter.getItem(info.position);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// Here's how you can get the correct item in onContextItemSelected()
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Object item = getListAdapter().getItem(info.position);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
64357 次 |
最近记录: |