
添加ContextMenu步骤:
if(Activity类)
1.声明一个ListView控件,并findViewById(id),或者GetListView()
2.在Activity的onCreate()中,为Activity设置OnCreateContextMenuListener
这时候,不需要写布局文件,就方便地拥有了一个呼出式的菜单
3.复写Activity的onContextItemSelected()
else if(ListActivity类)
1.在Activity的onCreate()中为List添加ContextMenu(重要一步)
registerForContextMenu(getListView());
2.复写onCreateContextMenu方法与onContextItemSelected方法(注意不是设置监听器)
以下是已经被我折腾了的code
1.主程序.java
package jun.listviewContextMenu;
import java.util.ArrayList;
import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class ListviewContextMenuActivity extends Activity
{
// ===========================================================
// Final Fields 静态变量
// ===========================================================
protected static final int CONTEXTMENU_DELETEITEM = 0;
// ===========================================================
// Fields 成员变量
// ===========================================================
// 用于获取ListView控件
protected ListView mFavList;
// 声明一个存放Favorite类型的LIST
protected ArrayList<Favorite> fakeFavs = new ArrayList<Favorite>();
// ===========================================================
// "Constructors"
// ===========================================================
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
/* Add some items to the list the listview will be showing. */
fakeFavs.add(new Favorite("John", "nice guy"));
fakeFavs.add(new Favorite("Yasmin", "hot girl"));
fakeFavs.add(new Favorite("Jack", "cool guy"));
this.mFavList = (ListView) this.findViewById(R.id.list_favorites);
initListView();
}
private void refreshFavListItems()
{
mFavList.setAdapter(new ArrayAdapter<Favorite>(this,
android.R.layout.simple_list_item_1, fakeFavs));
}
private void initListView()
{
/* Loads the items to the ListView. */
refreshFavListItems();
/*
* Add Context-Menu listener to the ListView.
* 为ListView设置监听器OnCreateContextMenuListener
*/
mFavList.setOnCreateContextMenuListener(new OnCreateContextMenuListener()
{
public void onCreateContextMenu(ContextMenu conMenu, View view,
ContextMenuInfo info)
{
conMenu.setHeaderTitle("ContextMenu");
// conMenu.add(0, 0, 0, "Delete this favorite!");
//这里在设置常量的时候设置零有好的地方也有不好的地方
//好处: 设置零会将这一项放在第一个
//不好的地方: 当你不关心这些项目的顺序的时候,设置零就会导致其他按钮的出发这个按钮的事件
// 应为两个按钮的ITEM_ID是一样的
conMenu.add(0, CONTEXTMENU_DELETEITEM, 0, "Delete this favorite!");
conMenu.add(1, 0, 0, "Add More Information");
conMenu.add(1, 0, 0, "Add New Person");
conMenu.add(2, 0, 0, "Update 1");
conMenu.add(1, 0, 0, "3rd Item");
conMenu.add(2, 0, 0, "Update 2");
//PS:groupid相同的ContextMenu不会放在一起,而是根据他们添加的顺序
/* Add as many context-menu-options as you want to. */
}
});
mFavList.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3)
{
// TODO Auto-generated method stub
Toast.makeText(ListviewContextMenuActivity.this,
"111111111111", 200).show();
}
});
}
// ===========================================================
// Methods from SuperClass/Interfaces
// ===========================================================
@Override
public boolean onContextItemSelected(MenuItem aItem)
{
ContextMenuInfo menuInfo = (ContextMenuInfo) aItem.getMenuInfo();
/*
* Switch on the ID of the item, to get what the user selected.
* 在前面设置itemID常量,来检测选中了哪一项
*/
switch (aItem.getItemId())
{
case CONTEXTMENU_DELETEITEM:
/* Get the selected item out of the Adapter by its position. */
Favorite favContexted = (Favorite) mFavList.getAdapter().getItem(0);
/* Remove it from the list. */
fakeFavs.remove(favContexted);
refreshFavListItems();
return true; /* true means: "we handled the event". */
}
return false;
}
// ===========================================================
// Inner and Anonymous Classes 匿名内部类
// ===========================================================
/** Small class holding some basic */
protected class Favorite
{
protected String name;
protected String kindness;
/**
* 简单的构造函数
*
* @param name
* @param kindness
*/
protected Favorite(String name, String kindness)
{
this.name = name;
this.kindness = kindness;
}
/** The ListView is going to display the toString() return-value! */
// toString函数
public String toString()
{
return name + " (" + kindness + ")";
}
public boolean equals(Object o)
{
// o是Faorite类的实例 && 传入的这个o的name与左边调用这个equal方法的实例的name一样(字符一样,顺序一样)
return o instanceof Favorite
&& ((Favorite) o).name.compareTo(name) == 0;
}
}
}
2.布局文件 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent" >
<TextView
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="Long-Press on of the Items in the list." />
<ListView android:id ="@+id/list_favorites"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent" />
</LinearLayout>