`

在ContextMenu中添加/删除ListView的Item

 
阅读更多

 

我们在写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

 

 

分享到:
评论

相关推荐

    C#利用ListView控件显示数据库数据

    当查询结果返回后,我们可以在ListView控件中逐条添加数据。假设ListView控件已经添加到窗体上,且有对应的列名(如ID、Name和Date),可以通过以下方式填充数据: ```csharp while (reader.Read()) { ListView...

    ContextMenu

    在`ContextMenu`的XML布局文件中,我们可以使用`&lt;menu&gt;`标签作为根元素,然后添加`&lt;item&gt;`标签来定义每个菜单项。例如: ```xml &lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt; &lt;item ...

    ListView:单击和长按弹出上下文菜单(ContextMenu)

    本篇文章将深入探讨如何在ListView中实现单击和长按事件,弹出上下文菜单(ContextMenu)。这通常用于提供针对列表项的快捷操作,提升用户体验。 首先,我们需要在清单文件(`AndroidManifest.xml`)中为我们的Activity...

    ListView的简单应用

    创建一个`ListViewItem`,并设置其文本,然后将其添加到ListView的Items集合中: ```csharp ListViewItem item = new ListViewItem("行1数据"); listView1.Items.Add(item); ``` 删除行通常是通过选择ListView中的...

    Listview 长按弹出菜单

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。`Listview 长按弹出菜单`的功能可以极大地提升用户体验,使得用户在查看列表项时能快速执行相关操作。本教程将深入讲解如何实现这个功能,以及...

    ListView案例两个,右击菜单+排序

    本篇文章将深入探讨在ListView上实现右击菜单、排序功能以及如何添加条目,这些都是Android开发中常见的需求。 首先,我们来讨论如何在ListView上实现右击菜单。在Android中,右击菜单通常通过上下文菜单(Context ...

    Android之上下文菜单ContextMenu

    为了使`ListView`中的每个项目都能弹出`ContextMenu`,需要在适配器的`getView()`方法中设置长按监听器: ```java @Override public View getView(int position, View convertView, ViewGroup parent) { // ... ...

    安卓Android源码——ContextMenu上下文选项菜单,长按后跳出菜单.zip

    3. **处理菜单项点击**:你需要重写`onContextItemSelected(MenuItem item)`方法来处理用户在`ContextMenu`中选择的项。每个菜单项都有一个唯一的ID,你可以根据这个ID来执行相应的操作。 ```java @Override ...

    ListView长按显示菜单

    在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。`ListView长按显示菜单` 是一个常见的交互设计,允许用户通过长按列表项(ListView中的每一行)来触发一个上下文相关的操作菜单,提供了对...

    ContextMenu的使用

    首先,`ContextMenu`的创建需要在`Activity`或`Fragment`中注册,并通过`registerForContextMenu()`方法指定需要添加上下文菜单的视图。例如,如果你有一个`ListView`,你可能会这样做: ```java public class ...

    Android编程实现为ListView创建上下文菜单(ContextMenu)的方法

    为了增加交互性,我们常常需要为ListView添加上下文菜单(ContextMenu),它会在用户长按列表项时弹出,提供针对该列表项的操作选项。以下将详细介绍如何在Android中为ListView创建上下文菜单。 首先,我们需要在布局...

    安卓Android源码——ContextMenu 上下文选项菜单,长按后跳出菜单.zip

    在安卓(Android)开发中,`ContextMenu`是一个重要的交互元素,它允许用户在长按某个视图或项目时显示一个包含多个操作选项的菜单。这个压缩包文件“安卓Android源码——ContextMenu 上下文选项菜单,长按后跳出...

    Android应用源码之ContextMenu 上下文选项菜单,长按后跳出菜单.zip

    例如,对于一个ListView,你可以在Adapter的`getView`方法中添加监听器。 ```java view.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { @Override public void onCreateContextMenu...

    ContextMenu 上下文选项菜单,长按后跳出菜单.zip

    此外,了解`ContextMenu.ContextMenuInfo`接口也很关键,这个接口提供了关于触发ContextMenu的视图的额外信息,比如在ListView中,它可以告诉你被长按的是哪一行数据。 总的来说,ContextMenu是Android应用中提高...

    T392413343 论坛问题的回答的代码

    在C#编程中,ListView控件是一个非常常用且功能强大的组件,主要用于展示列表形式的数据,常见于各种桌面应用和Windows Forms程序中。本篇将详细探讨`ListView`控件的使用,结合`T392413343`论坛问题的回答,我们将...

    安卓Andriod源码——ContextMenu上下文选项菜单,长按后跳出菜单.zip

    在上面的代码中,我们为ListView注册了ContextMenu,并在`onCreateContextMenu()`中添加了两个菜单项:删除和分享。 5. **菜单图标和分组** 除了文字之外,你还可以为菜单项添加图标。使用`menu.add(int group, ...

    安卓开发-ContextMenu 上下文选项菜单,长按后跳出菜单.zip.zip

    在Android应用开发中,ContextMenu是实现用户长按操作后弹出功能菜单的一种常见方式。它为用户提供了一种快捷的操作选项,通常在ListView、GridView或TextView等可点击元素上使用。本教程将深入探讨如何在Android中...

    Android高级应用源码-ContextMenu 上下文选项菜单,长按后跳出菜单.zip

    2. **定义菜单项**:在对应的Activity或Fragment中重写`onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)`方法,这里可以添加菜单项并设置它们的标题、图标和点击事件。...

    Android编程实现带有图标的ListView并带有长按菜单效果示例

    在`getView()`方法中,我们将根据`ListViewItem`的数据来设置每个列表项的图标和文本。 ```java public class CustomListViewAdapter extends BaseAdapter { private Context context; private List&lt;ListViewItem...

    C#批量获取web网站html页面截图

    ListViewItem item = new ListViewItem(e.ProgressPercentage.ToString()); item.ImageIndex = listView.ImageList.Images.Add(Image.FromFile(e.UserState.ImagePath)); item.SubItems.Add(e.UserState.Url); ...

Global site tag (gtag.js) - Google Analytics