mun*_* pk 33 android listview contextmenu
我正在开发一个android应用程序.我将有一个listview,并且我设置了一个上下文菜单,当listview项目被长按时出现.如何从列表视图项目中选择项目(比如listview textview中的文本)选择了一个来自contextmenu的动作,我可以处理它吗?这是一些代码:
protected void onCreate(Bundle savedInstanceState) {
-------
lv1 = (ListView) findViewById(R.id.listings);
registerForContextMenu(lv1);
lv1.setOnItemClickListener(this);
}
Run Code Online (Sandbox Code Playgroud)
和onCreateContextMenu:
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();
switch (item.getItemId()) {
case R.id.watch:
String name = "";
return true;
case R.id.buy:
return true;
default:
return super.onContextItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
我想从列表项中的textview获取文本.我如何实现这一目标?
Piy*_*ush 69
你应该注册LISTVIEW上下文菜单.
这是源头.
用于onCreate():
registerForContextMenu(lv);
Run Code Online (Sandbox Code Playgroud)
并且在长按期间访问所选项目:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
if (v.getId() == R.id.lv) {
ListView lv = (ListView) v;
AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
YourObject obj = (YourObject) lv.getItemAtPosition(acmi.position);
menu.add("One");
menu.add("Two");
menu.add("Three");
menu.add(obj.name);
}
}
Run Code Online (Sandbox Code Playgroud)
Kam*_*ryn 33
要从所选的ListView项中获取项,请参阅ContextMenuInfo对象(请参阅下面的上一个实现方法).完整解决方案如下:
1)在ListActivity类中为上下文菜单注册ListView
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
getListView().setAdapter(mAdapter);
registerForContextMenu(getListView());
}
Run Code Online (Sandbox Code Playgroud)
1a)如果您的列表中有复杂的View,则可能需要长度单击Adapter类中的每个列表视图
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
RelativeLayout layout = (RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
itemLayout = layout;
itemLayout.setLongClickable(true);
}
// ...
return view;
}
Run Code Online (Sandbox Code Playgroud)
2)在ListActivity类中实现onCreateContextMenu()和onContextItemSelected()
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
String title = ((MyItem) mAdapter.getItem(info.position)).getTitle();
menu.setHeaderTitle(title);
menu.add(Menu.NONE, MENU_CONTEXT_DELETE_ID, Menu.NONE, DELETE_TEXT);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_CONTEXT_DELETE_ID:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Log.d(TAG, "removing item pos=" + info.position);
mAdapter.remove(info.position);
return true;
default:
return super.onContextItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于onItemLongClick()方法,不要将其用于上下文菜单。
相反,为上下文菜单注册 LISTVIEW。
这是来源。
对于 onCreate():
registerForContextMenu(lv);
Run Code Online (Sandbox Code Playgroud)
并在长按期间访问所选项目:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
if (v.getId() == R.id.lv) {
ListView lv = (ListView) v;
AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
YourObject obj = (YourObject) lv.getItemAtPosition(acmi.position);
menu.add("One");
menu.add("Two");
menu.add("Three");
menu.add(obj.name);
}
}
Run Code Online (Sandbox Code Playgroud)