Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1275927
  • 博文数量: 247
  • 博客积分: 5587
  • 博客等级: 大校
  • 技术积分: 2060
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-24 13:27
文章分类
文章存档

2012年(101)

2011年(44)

2010年(102)

分类: 嵌入式

2012-05-17 16:57:11


       写Android程序的时候,免不了要使用ListView,也免不了要使用ContextMenu,但是如何将其结合起来呢。比如Contacts程序是如何删除练习人的呢。

       添加或则删除一个tem有不同的方式,添加Item可以使用ListView自身带的add()方法即可,但是在ContextMenu中删除这个Item还是有些麻烦的。

       下面是一个小例子:
       1、可以在EditText中输入内容后动态添加Item
       2、可以在ContextMenu中添加(但只能添加同一个Item)
       3、可以点击Item直接删除Item
       4、可以长按Item后弹出ContextMenu来删除Item

java代码:


  1. android:orientation="vertical"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent"
  4. >

  5. android:orientation="horizontal"
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content">

  8. android:id="@+id/edittext"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_weight="1"
  12. />

  13. android:id="@+id/additem"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:layout_weight="4"
  17. android:text="添加"
  18. />



  19. android:id="@android:id/list"
  20. android:layout_width="fill_parent"
  21. android:layout_height="wrap_content"
  22. />


复制代码

       ArrayAdapterTest.java

java代码:

  1. package eoe.arrayadapter;


  2. import java.util.ArrayList;
  3. import android.app.ListActivity;
  4. import android.os.Bundle;
  5. import android.view.ContextMenu;
  6. import android.view.ContextMenu.ContextMenuInfo;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.view.View;
  10. import android.widget.AdapterView.AdapterContextMenuInfo;
  11. import android.widget.ArrayAdapter;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.widget.ListView;
  15. import android.widget.Toast;


  16. public class ArrayActivity extends ListActivity {
  17. private EditText inputtext;
  18. private Button btnadd;
  19. private ArrayList list = new ArrayList();
  20. ArrayAdapter adapter;
  21. private static final int ITEM1=Menu.FIRST;
  22. private static final int ITEM2=Menu.FIRST+1;
  23. private static final int ITEM3=Menu.FIRST+2;


  24. @Override
  25. public void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. /**
  28. * 这里虽然是继承了ListActivit,但是如果想使用自己的布局,
  29. * ListView中的id必须是“@android:id/list”,否则出错
  30. */


  31. setContentView(R.layout.main);
  32. inputtext = (EditText)findViewById(R.id.edittext);
  33. btnadd = (Button)findViewById(R.id.additem);
  34. adapter = new ArrayAdapter(  this,  android.R.layout.simple_expandable_list_item_1,  list);
  35. //设置适配器
  36. setListAdapter(adapter);
  37. //为 ListView 的所有 item 注册 ContextMenu
  38. this.registerForContextMenu(getListView());
  39. btnadd.setOnClickListener(new Button.OnClickListener(){


  40. @Override
  41. public void onClick(View v) {
  42. list.add(inputtext.getText().toString());
  43. adapter.notifyDataSetChanged();
  44. inputtext.setText("");
  45. }
  46. });
  47. }

复制代码





java代码:

  1. //设置Context,用来进行删除操作


  2. @Override
  3. protected void onListItemClick(ListView l, View v, int position, long id) {
  4. // TODO Auto-generated method stub
  5. super.onListItemClick(l, v, position, id);
  6. list.remove(position);
  7. adapter.notifyDataSetChanged();
  8. Toast.makeText(getApplicationContext(), "删除此项", Toast.LENGTH_SHORT).show();
  9. }


  10. @Override
  11. public void onCreateContextMenu(ContextMenu menu, View v,
  12. ContextMenuInfo menuInfo) {
  13. // TODO Auto-generated method stub
  14. super.onCreateContextMenu(menu, v, menuInfo);
  15. menu.setHeaderTitle("提示信息");
  16. menu.setHeaderIcon(R.drawable.icon);
  17. menu.add(0,ITEM1,0,"删除Item");
  18. menu.add(0,ITEM2,0,"添加Item");
  19. menu.add(0,ITEM3,0,"关于我");
  20. }


  21. @Override
  22. public boolean onContextItemSelected(MenuItem item) {
  23. AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo();
  24. switch(item.getItemId())
  25. {
  26. case ITEM1:
  27. //System.out.println("Item id="+item.getItemId());
  28. //System.out.println("position="+getListAdapter().getItemId(menuInfo.position));


  29. /**
  30. * getListAdapter().getItemId(menuInfo.position)返回的值是Long型,
  31. * 而list.remove(position)是String java.util.ArrayList.remove(int index),
  32. * 所以当执行到这里的时候,如果直接使用Long型的话,由于不是int型的,所以默认
  33. * 使用的是:boolean java.util.ArrayList.remove(Object object)
  34. * 两个remove()不匹配,所以重载的是remove(Object object),而这个方法是不能删除item的
  35. * 所以需要将得到的position强制转换为int型的才能运行
  36. */


  37. //list.remove(getListAdapter().getItemId(menuInfo.position));这句话是错误的
  38. int pos = (int) getListAdapter().getItemId(menuInfo.position);
  39. if(list.remove(pos) != null){
  40. System.out.println("success");
  41. }else{
  42. System.out.println("failed");
  43. }
  44. adapter.notifyDataSetChanged();
  45. Toast.makeText(getApplicationContext(), "删除此项", Toast.LENGTH_SHORT).show();
  46. break;
  47. case ITEM2:
  48. list.add("我是花郎!");
  49. adapter.notifyDataSetChanged();
  50. break;
  51. case ITEM3:
  52. Toast.makeText(getApplicationContext(), "我是花郎!", Toast.LENGTH_SHORT).show();
  53. break;
  54. }
  55. return super.onContextItemSelected(item);
  56. }

  57. }

复制代码

       在这里需要说明几点:

       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型的才能运行

        首先添加几项数据,这是动态添加的

10.jpg

        点击2,即可删除该Item

11.png

        长按3Item,弹出ContextMenu后,点击删除Item




阅读(7761) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~