在ContextMenu中添加/删除ListView的Item

本文介绍如何在Android程序中结合使用ListView和ContextMenu实现动态添加和删除联系人项的功能。通过实例展示了EditText输入后添加Item,ContextMenu中添加、删除Item,以及长按触发ContextMenu删除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

 

 

正确的 <GridView > <GridViewColumn Header="名称" DisplayMemberBinding="{Binding Name}" Width="300"/> <GridViewColumn Header="类型" DisplayMemberBinding="{Binding Type}" Width="200"/> <GridViewColumn Header="大小" DisplayMemberBinding="{Binding Size}" Width="200"/> <GridViewColumn Header="修改日期" DisplayMemberBinding="{Binding LastWriteTime}" Width="250"/> </GridView> </ListView.View> <!-- 上下文菜单定义 --> <ListView.ContextMenu> <ContextMenu Name="FileContextMenu" Background="#333333" Foreground="White" FontWeight="Bold"> <MenuItem Header="打开" Click="OpenMenuItem_Click"/> <MenuItem Header="属性" Click="PropertiesMenuItem_Click"/> <Separator/> <MenuItem Header="复制" Click="CopyMenuItem_Click"/> <MenuItem Header="删除" Click="DeleteMenuItem_Click"/> <Separator/> <MenuItem Header="重命名" Click="RenameMenuItem_Click"/> </ContextMenu> </ListView.ContextMenu> </ListView> 优化后的 <ListView x:Name="FileListView" Grid.Column="1" FontSize="25" Background="#333333" Foreground="White" FontWeight="Bold" PreviewMouseLeftButtonUp="FileListView_PreviewMouseLeftButtonUp" > <!-- 列表项样式定义 --> <ListView.Resources> <!-- 目录/文件前景色转换器 --> <local:FileTypeColorConverter x:Key="ColorConverter"/> <!-- 自定义ListViewItem样式 --> <Style TargetType="{x:Type ListViewItem}"> <!-- 解决选择行高亮问题 --> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ListViewItem}"> <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="0"> <ContentPresenter /> </Border> <ControlTemplate.Triggers> <!-- 鼠标悬停效果 --> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="#444444"/> </Trigger> <!-- 选中项效果 (降低亮度) --> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="#1E3C5F"/> <Setter Property="Foreground" Value="White"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <!-- 目录/文件颜色区分 --> <Setter Property="Foreground"> <Setter.Value> <!-- Converter="{StaticResource ColorConverter}"--> <MultiBinding Converter="{StaticResource ColorConverter}"> <Binding Path="IsDirectory"/> <Binding Path="IsSelected" RelativeSource="{RelativeSource Self}"/> </MultiBinding> </Setter.Value> </Setter> </Style> <!-- 上下文菜单样式 --> <Style TargetType="{x:Type ContextMenu}"> <!-- 解决下拉菜单左边空白 --> <Setter Property="Padding" Value="0"/> <Setter Property="Margin" Value="0"/> </Style> </ListView.Resources> <!-- 列表视图 --> <ListView.View> <GridView> <!-- 名称列使用自定义模板实现颜色区分 DisplayMemberBinding="{Binding Name}"--> <GridViewColumn Header="名称" Width="300" > <GridViewColumn.CellTemplate> <DataTemplate> <!--Text="{Binding Name}" --> <TextBlock Text="{Binding Name}" Foreground="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=Foreground}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="类型" DisplayMemberBinding="{Binding Type}" Width="200"/> <GridViewColumn Header="大小" DisplayMemberBinding="{Binding Size}" Width="200"/> <GridViewColumn Header="修改日期" DisplayMemberBinding="{Binding LastWriteTime}" Width="250"/> </GridView> </ListView.View> <!-- 上下文菜单 --> <ListView.ContextMenu> <ContextMenu Name="FileContextMenu" Background="#333333" Foreground="White" FontWeight="Bold"> <!-- 解决菜单项左边空白 --> <ContextMenu.ItemContainerStyle> <Style TargetType="{x:Type MenuItem}"> <Setter Property="Padding" Value="10 5 20 5"/> </Style> </ContextMenu.ItemContainerStyle> <MenuItem Header="打开" Click="OpenMenuItem_Click"/> <MenuItem Header="属性" Click="PropertiesMenuItem_Click"/> <Separator/> <MenuItem Header="复制" Click="CopyMenuItem_Click"/> <MenuItem Header="删除" Click="DeleteMenuItem_Click"/> <Separator/> <MenuItem Header="重命名" Click="RenameMenuItem_Click"/> </ContextMenu> </ListView.ContextMenu> </ListView> 优化后的代码有问题,不能正确显示 内容 而是显示的类的名称 FileListView.Items.Add(new FileSystemItem(file)
最新发布
11-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值