我们在写Android程序的时候,免不了要使用ListView,也免不了要使用ContextMenu,但是如何将其结合起来呢。比如Contacts程序是如何删除练习人的呢。
添加或则删除一个tem有不同的方式,添加Item可以使用ListView自身带的add()方法即可,但是在ContextMenu中删除这个Item还是有些麻烦的。
下面是一个小例子:
1、可以在EditText中输入内容后动态添加Item
2、可以在ContextMenu中添加(但只能添加同一个Item)
3、可以点击Item直接删除Item
4、可以长按Item后弹出ContextMenu来删除Item
看代码:
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"
>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button
android:id="@+id/additem"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="4"
android:text="添加"
/>
</LinearLayout>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
ArrayAdapterTest.java
package com.loulijun.arrayadapter;
import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
public class ArrayActivity extends ListActivity {
private EditText inputtext;
private Button btnadd;
private ArrayList<String> list = new ArrayList<String>();
ArrayAdapter<String> adapter;
private static final int ITEM1=Menu.FIRST;
private static final int ITEM2=Menu.FIRST+1;
private static final int ITEM3=Menu.FIRST+2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 这里虽然是继承了ListActivit,但是如果想使用自己的布局,
* ListView中的id必须是“@android:id/list”,否则出错
*/
setContentView(R.layout.main);
inputtext = (EditText)findViewById(R.id.edittext);
btnadd = (Button)findViewById(R.id.additem);
adapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_expandable_list_item_1,
list);
//设置适配器
setListAdapter(adapter);
//为 ListView 的所有 item 注册 ContextMenu
this.registerForContextMenu(getListView());
btnadd.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
list.add(inputtext.getText().toString());
adapter.notifyDataSetChanged();
inputtext.setText("");
}
});
}
//设置Context,用来进行删除操作
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
list.remove(position);
adapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(), "删除此项", Toast.LENGTH_SHORT).show();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("提示信息");
menu.setHeaderIcon(R.drawable.icon);
menu.add(0,ITEM1,0,"删除Item");
menu.add(0,ITEM2,0,"添加Item");
menu.add(0,ITEM3,0,"关于我");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo();
switch(item.getItemId())
{
case ITEM1:
//System.out.println("Item id="+item.getItemId());
//System.out.println("position="+getListAdapter().getItemId(menuInfo.position));
/**
* getListAdapter().getItemId(menuInfo.position)返回的值是Long型,
* 而list.remove(position)是String java.util.ArrayList.remove(int index),
* 所以当执行到这里的时候,如果直接使用Long型的话,由于不是int型的,所以默认
* 使用的是:boolean java.util.ArrayList.remove(Object object)
* 两个remove()不匹配,所以重载的是remove(Object object),而这个方法是不能删除item的
* 所以需要将得到的position强制转换为int型的才能运行
*/
//list.remove(getListAdapter().getItemId(menuInfo.position));这句话是错误的
int pos = (int) getListAdapter().getItemId(menuInfo.position);
if(list.remove(pos) != null)
{
System.out.println("success");
}
else
{
System.out.println("failed");
}
adapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(), "删除此项", Toast.LENGTH_SHORT).show();
break;
case ITEM2:
list.add("我是花郎!");
adapter.notifyDataSetChanged();
break;
case ITEM3:
Toast.makeText(getApplicationContext(), "我是花郎!", Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
}
在这里需要说明几点:
1、本程序是继承ListActivity,但是又用到了自己定义的布局文件。注意,这里的布局文件一定要包含ListView,并且id必须是"@android:id/list",否则会报错
2、 getListAdapter().getItemId(menuInfo.position)返回的值是Long型, 而list.remove(position)是String java.util.ArrayList.remove(int index), 所以当执行到这里的时候,如果直接使用Long型的话,由于不是int型的,所以默认使用的是:boolean java.util.ArrayList.remove(Object object) 两个remove()不匹配,所以重载的是remove(Object object),而这个方法是不能删除item的所以需要将得到的position强制转换为int型的才能运行
首先添加几项数据,这是动态添加的
点击2,即可删除该Item
长按3Item,弹出ContextMenu后,点击删除Item
长按任一一个Item,然后点击“添加Item”,可以添加“我是花郎!”这个Item