您的位置:首页 > 其它

在ContextMenu中添加/删除ListView的Item

2012-04-20 20:40 507 查看
我们在写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

Java代码



<?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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: