android学习记录(八)实现ListView的长按进入多选删除模式。

今天在仿制一个应用的时候,发现我不会实现listView的长按进入多选这个功能,就找了一下资料。。发现找资料用去的时间还是蛮多的。。。天。理解完之后,自己写了一份代码。

       简单来说,就是实施对ListView中item的长按监控,对CheckBox的显示与隐藏进行操作而已。好像有一个ListView中有一个setChoseMode方法。。不太清楚怎么用的,等下我再看看研究研究,应该会更简便。本编例子只显示一个基本的想法,详细实现---略。欢迎交流。


simple_item_listview.xml代码



    
    


activity的xml只有一个listView


主代码:

public class MainActivity extends ActionBarActivity implements OnItemLongClickListener,OnClickListener{
	
	private ListView mListView;
	private Button mDelBt;
	
	private BaseAdapter mBaseAdapter;
	
	private static final int CHOICE_MODE = 1;				//多选模式的标识	
	private static final int DELETE_BUTTON_ID = 1;			//删除button的id
	private int mode = 0;									//当前模式的标识
	
	final String[] data = new String[]{"i","like","android"};//本例只做简单示范,不对数据进行删除操作。

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mListView = (ListView)findViewById(R.id.listview);
		mListView.setOnItemLongClickListener(this);
		
		initAdapter();													//初始化adapter
	
		mListView.setAdapter(mBaseAdapter);
	}
	
	/**
	 * 初始化adapter。为方便大家看,这里就不继承重写BaseAdapter类了。
	 */
	private void initAdapter() {
			mBaseAdapter = new BaseAdapter() {
			
			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				if(convertView == null){
					
					convertView = getLayoutInflater().inflate(R.layout.simple_item_listview, null);
				}
				
				TextView tv = (TextView) convertView.findViewById(R.id.simple_item_tv);
				tv.setText(data[position]);
				
				CheckBox cb = (CheckBox) convertView.findViewById(R.id.simple_item_cb);
				
				if(mode==CHOICE_MODE){
					cb.setVisibility(View.VISIBLE);
				}else{
					cb.setVisibility(View.GONE);
				}
				return convertView;
			}
			
			@Override
			public long getItemId(int position) {
				return position;
			}
			
			@Override
			public Object getItem(int position) {
				return data[position];
			}
			
			@Override
			public int getCount() {
				return data.length;
			}
		};		
	}

	/* 
	 * 监控listview的长按事件,当长按时更改视图,显示checkbox,让用户对
	 * 其进行多选。
	 */
	@Override
	public boolean onItemLongClick(AdapterView parent, View view,
			int position, long id) {
		mode = CHOICE_MODE;
		((CheckBox)view.findViewById(R.id.simple_item_cb)).setChecked(true);	//选中被长按的item
		mBaseAdapter.notifyDataSetChanged();
		showDeleteButton();
		return false;
	}
	
	/**
	 * 展示删除按钮
	 */
	private void showDeleteButton() {
		android.widget.AbsListView.LayoutParams params = new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		
		mDelBt = new Button(this);
		mDelBt.setId(DELETE_BUTTON_ID);
		mDelBt.setLayoutParams(params);
		mDelBt.setText("删除");
		mDelBt.setOnClickListener(this);
		mListView.addFooterView(mDelBt);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case DELETE_BUTTON_ID:
			
			//删除操作方法在这里,里面首先要获取哪些被选中,才能对其进行操作。
			delete();
			
			mListView.removeFooterView(mDelBt);		//隐藏删除button
			
			mode = 0;					//还原为非多选模式,隐藏checkbox
			
			mBaseAdapter.notifyDataSetChanged();		//更新视图
			
			break;

		default:
			break;
		}
	}

	/**
	 * 删除item方法
	 */
	private void delete() {
		//可以是遍历哪个被check了,然后对其进行操作,数据方面需要有一个保存是否check的变量。本例为简便没有设置。
	}

昨晚看到了一个actionMode的长按显示删除方法,觉得很好用,兼容到2.1版本的,也比较美观,比这个在listView底下添加视图好看多了!!具体方法的文章:Android新的menu实现——ActionMode


同时注意在那篇文章的设置中,

切记要在onDestoryActionMode方法里把actionMode设置为null,因为当调用actionMode.finish()方法的时候会调用这个方法,需要把我们的actionMode变量重新设置为null,以帮助在使用时检验是否已经开启了actionMode模式,从而判断是否进入actionMode模式。


你可能感兴趣的:(android学习记录)