ListView多选删除功能实现。

主体思想,把要删除的位置放入List中进行保存,之后根据list进行删除。

实现了全选,反选删除功能。

MainActivity

public class MainActivity extends Activity {

	ListView show;
	List<String> datas = new ArrayList<String>();
	ListAdapter adapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		show = (ListView)findViewById(R.id.showList);
		//ListView刷新数据
		refresh();
	}

	private void refresh() {
		datas.clear();
		for(int i = 0; i < 30; i++)
		{
			datas.add("数据" + i);
		}
		adapter = new ListAdapter(this,datas);
		show.setAdapter(adapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		switch(item.getItemId())
		{
		//重新加载数据
		case R.id.action_settings:
			refresh();
			break;
		//删除数据
		case R.id.action_delete:
			adapter.update();
			break;
		//全选
		case R.id.action_selectAll:
			adapter.selectAll();
			break;
		//反选
		case R.id.action_invert:
			adapter.invert();
			break;
		}
		return true;
	}

自定义adapter之ListAdapter

public class ListAdapter extends BaseAdapter
{
	LayoutInflater inflater;
	List<String> AdapterDatas;
	List<Integer> checkState;

	public ListAdapter(Context context,List<String> datas)
	{
		inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		AdapterDatas = datas;
		checkState = new ArrayList<Integer>();
	}
	@Override
	public int getCount() {
		return AdapterDatas.size();
	}

	@Override
	public Object getItem(int position) {
		return AdapterDatas.get(position);
	}

	@Override
	public long getItemId(int position) {
		return 0;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		Holder holder = new Holder();
		if(convertView == null)
		{
			convertView = inflater.inflate(R.layout.main_item, null);
			holder.tv = (TextView)convertView.findViewById(R.id.item_title);
			holder.check = (CheckBox)convertView.findViewById(R.id.check);
			convertView.setTag(holder);
			System.out.println("新的View的位置是:" + position);
		}
		else
		{
			holder = (Holder) convertView.getTag();
			System.out.println("旧的View的位置是:" + position);
		}

		holder.tv.setText(AdapterDatas.get(position));
		if(checkState.contains(position))
		{
			holder.check.setChecked(true);
		}
		else
		{
			holder.check.setChecked(false);
		}
		holder.check.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				CheckBox check = (CheckBox)v;
				if(check.isChecked())
				{
					checkState.add(position);
				}
				else
				{
					checkState.remove((Integer)position);
				}
			}
		});
		convertView.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(inflater.getContext(), "" + position, Toast.LENGTH_SHORT).show();
			}
		});
		return convertView;
	}

	//删除选择项
	public void update()
	{
		//根据位置删除list中元素时,由于删除一个元素后面的元素的
		//位置也相应的改变,所以先进行排序,从list后面开始删除
		Collections.sort(checkState);
		for(int i = checkState.size()-1 ;i >= 0;i--)
		{
			AdapterDatas.remove((int)checkState.get(i));
		}
		checkState.clear();
		notifyDataSetChanged();
	}
	//选择全部
	public void selectAll()
	{
		checkState.clear();
		for(int i = 0;i < AdapterDatas.size();i++)
		{
			checkState.add((Integer)i);
		}
		notifyDataSetChanged();
	}
	//反选
	public void invert()
	{
		for(int i = 0;i < AdapterDatas.size();i++)
		{
			if(checkState.contains((Integer)i))
			{
				checkState.remove((Integer)i);
			}
			else
			{
				checkState.add((Integer)i);
			}
		}
		notifyDataSetChanged();
	}

	public class Holder
	{
		TextView tv;
		CheckBox check;
	}
}

一个卡了挺久的问题:

本来列表项中的checkBox的事件是setOnCheckedChangeListener这个事件由checkBox的点击状态改变触发。

逻辑上是没有问题的。关键是每当隐藏一个列表项时,就会触发这个方法(可能是android的默认机制的原因吧),

从而无缘无故的执行setOnCheckedChangeListener事件中的语句,导致了错误的结果。

无奈只有改变了触发事件改成了setOnClickListener这种单击的模式。

时间: 2024-08-29 14:17:02

ListView多选删除功能实现。的相关文章

【凯子哥带你夯实应用层】使用ActionMode实现有删除动画的多选删除功能

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 ActionMode是3.0之后,官方推荐的一种上下文菜单的实现方式,在之前一直用的是Context Menu,今天这篇文章简单介绍一下ActionMode,并实现多选删除功能. 如果要在ListView这类控件中实现多选,我们可以通过设置setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL)来实现,然后通过设置setMultiChoiceModeListen

IOS UITableView多选删除功能

UITbableView作为列表展示信息,除了展示的功能,有时还会用到删除,比如购物车.收藏列表等. 单行删除功能可以直接使用系统自带的删除功能,当横向轻扫cell时,右侧出现红色的删除按钮,点击删除当前cell.或者让表格进入编辑状态后,点击左侧的红色按钮,右侧出现删除按钮,删除,如下图所示.单行自带删除已经在前面文章中进行过讲解,需要的可以去查阅. 多选删除是点击编辑按钮,让表格进入编辑状态后,每行的左侧出现一个小圆圈,当点击行的时候,可以选中该行或者取消选中该行,当点击按钮确定删除的时候才

自定义listView添加滑动删除功能

今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个删除的事件,在事件中进行删除当选行的元素,刷新listview. 一共分为以下几步进行: 1.新建一个按钮的布局文件,用来作为动态添加的按钮:layout_button.xml <?xml version="1.0" encoding="utf-8"?> &

android 继承ListView实现滑动删除功能.

在一些用户体验较好的应用上,可以经常遇见   在ListView中  向左或向右滑动便可删除那一项列表. 具体实现  则是继承ListView实现特定功能即可. (1). 新建 delete_button.xml文件 <?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" a

不用ChoiceMode实现ListView的长按进入多选删除模式。

今天在仿制一个应用的时候,发现我不会实现listView的长按进入多选这个功能,就找了一下资料..发现找资料用去的时间还是蛮多的...天.理解完之后,自己写了一份代码. 简单来说,就是实施对ListView中item的长按监控,对CheckBox的显示与隐藏进行操作而已.好像有一个ListView中有一个setChoseMode方法..不太清楚怎么用的,等下我再看看研究研究,应该会更简便.本编例子只显示一个基本的想法,详细实现---略.欢迎交流. simple_item_listview.xml

安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能

大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下拉是怎么实现的,滑动删除功能是怎么实现,其实要实现这些功能又不是唯一的方法,但是基本上思想都是一致的.然后gitup上的这些例子是非常的多,然后实现的也是大同小异但是也不能不让我们去球童存异.作为天朝的程序员即使是一个伸手党也不必太觉得羞耻,能把别人的东西来改一改或者沿用别人的思想来模仿也是不错的.

Delphi中ListView中实现自定义删除功能的方法

Delphi中ListView中实现自定义删除功能的方法 第一种:有时删除文件会出现文件删不掉现象 if lvMain.InnerListView.ItemIndex <> -1 then begin // DoContextMenuVerb(lvMain.SelectedFolder, 'delete'); DoContextMenuVerbB(lvMain.Folders[lvMain.InnerListView.ItemIndex], 'delete'); 第二种:删除功能很强大,建议使

实现listview滑动删除功能_Android源码

实现listview滑动删除功能,动作流畅. 下载地址:http://www.devstore.cn/code/info/579.html

ZP的EXTJS学习笔记(三)——邮箱功能的开发(按钮事件、下拉框、分页、record小图标、整条数据格式处理、定时刷新、record复选删除、分组)

照例,先贴效果图: 本人比较满意,短时间开发的邮箱功能,这是收件箱,还有配套的发件箱与删除箱. 简单说下思路: 1.配置model.store,用的是MVC模式,可参考第一篇学习笔记. 2.页面简单布局: Ext.define('KitchenSink.view.mail.InBox', { extend: 'Ext.grid.Panel', alias : 'widget.inbox', xtype: 'inbox', autoHeight:true, bodyStyle:'width:100