首页>代码>Android GridView实现全选反选效果>/GridView/src/com/kiritor/HomeActivity.java
package com.kiritor;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.LayoutParams;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.BaseAdapter;
import android.widget.Checkable;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;

public class HomeActivity extends Activity implements MultiChoiceModeListener {

	private GridView mGridView;
	private GridAdapter mGridAdapter;
	private TextView mActionText;
	private static final int MENU_SELECT_ALL = 0;
	private static final int MENU_UNSELECT_ALL = MENU_SELECT_ALL + 1;
	private Map<Integer, Boolean> mSelectMap = new HashMap<Integer, Boolean>();

	private int[] mImgIds = new int[] { R.drawable.img_1, R.drawable.img_2,
			R.drawable.img_3, R.drawable.img_4, R.drawable.img_5,
			R.drawable.img_6, R.drawable.img_7, R.drawable.img_8,
			R.drawable.img_9, R.drawable.img_1, R.drawable.img_2,
			R.drawable.img_3, R.drawable.img_4, R.drawable.img_5,
			R.drawable.img_6, R.drawable.img_7, R.drawable.img_3,
			R.drawable.img_4, R.drawable.img_5, R.drawable.img_5 };

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mGridView = (GridView) findViewById(R.id.gridview);
		mGridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);// 设置为多选模式
		mGridAdapter = new GridAdapter(this);
		mGridView.setAdapter(mGridAdapter);// 数据适配
		mGridView.setMultiChoiceModeListener(this);// 设置多选模式监听器
	}

	/** Override MultiChoiceModeListener start **/
	@Override
	public boolean onCreateActionMode(ActionMode mode, Menu menu) {
		// TODO Auto-generated method stub
		// 得到布局文件的View
		View v = LayoutInflater.from(this).inflate(R.layout.actionbar_layout,
				null);
		mActionText = (TextView) v.findViewById(R.id.action_text);
		// 设置显示内容为GridView选中的项目个数
		mActionText.setText(formatString(mGridView.getCheckedItemCount()));
		// 设置动作条的视图
		mode.setCustomView(v);
		// 得到菜单
		getMenuInflater().inflate(R.menu.action_menu, menu);
		return true;
	}

	@Override
	public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
		// TODO Auto-generated method stub
		/* 初始状态下,如果选中的项数不等于总共的项数,设置"全选"的状态为True */
		menu.getItem(MENU_SELECT_ALL).setEnabled(
				mGridView.getCheckedItemCount() != mGridView.getCount());
		return true;
	}

	@Override
	public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
		// TODO Auto-generated method stub
		/*
		 * 当点击全选的时候,全选 点击全不选的时候全不选
		 */
		switch (item.getItemId()) {
		case R.id.menu_select:
			for (int i = 0; i < mGridView.getCount(); i++) {
				mGridView.setItemChecked(i, true);
				mSelectMap.put(i, true);
			}
			break;
		case R.id.menu_unselect:
			for (int i = 0; i < mGridView.getCount(); i++) {
				mGridView.setItemChecked(i, false);
				mSelectMap.clear();
			}
			break;
		}
		return true;
	}

	@Override
	public void onDestroyActionMode(ActionMode mode) {
		// TODO Auto-generated method stub
		mGridAdapter.notifyDataSetChanged();
	}

	@Override
	public void onItemCheckedStateChanged(ActionMode mode, int position,
			long id, boolean checked) {
		// TODO Auto-generated method stub
		// 当每个项状态改变的时候的操作
		mActionText.setText(formatString(mGridView.getCheckedItemCount()));
		mSelectMap.put(position, checked);/* 放入选中的集合中 */
		mode.invalidate();
	}

	/** Override MultiChoiceModeListener end **/

	private String formatString(int count) {
		return String.format(getString(R.string.selection), count);
	}

	private class GridAdapter extends BaseAdapter {

		private Context mContext;

		public GridAdapter(Context ctx) {
			mContext = ctx;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mImgIds.length;
		}

		@Override
		public Integer getItem(int position) {
			// TODO Auto-generated method stub
			return Integer.valueOf(mImgIds[position]);
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@SuppressWarnings("deprecation")
		@Override
		/* 得到View */
		public View getView(int position, View convertView, ViewGroup parent) {
			GridItem item;
			if (convertView == null) {
				item = new GridItem(mContext);
				item.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
						LayoutParams.FILL_PARENT));
			} else {
				item = (GridItem) convertView;
			}
			item.setImgResId(getItem(position));
			item.setChecked(mSelectMap.get(position) == null ? false
					: mSelectMap.get(position));
			return item;
		}
	}

}
最近下载更多
2252391595  LV1 1月18日
wanglong_wang  LV13 2022年3月16日
caigenjiang  LV1 2020年5月12日
恋伊love  LV9 2018年12月17日
seriousalpha2018  LV1 2018年12月13日
qingkuankuan  LV1 2018年7月24日
103155  LV1 2018年7月22日
分位数  LV2 2018年6月18日
Mclnt0sh  LV1 2018年3月27日
yinshilin  LV1 2018年3月12日
最近浏览更多
2252391595  LV1 1月18日
sks666  LV5 2023年2月19日
uni-code_0123  LV1 2022年11月16日
wanglong_wang  LV13 2022年3月16日
lingtiejing  LV15 2022年2月23日
wyx065747  LV67 2021年1月3日
a566566  LV9 2020年12月27日
cuiaaaaaa  LV1 2020年12月12日
wangyaru  LV1 2020年6月26日
doremi  LV6 2020年6月17日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友