天天看點

Android實戰之ListView複選框

項目中有用到複選框的例子,啊啊......在網上查找有關資料,大多都是過于繁瑣,是以自己決定寫個這個方面的demo。。。

先給個效果圖:

Android實戰之ListView複選框

在ListView中添加複選框主要注意以下幾個問題:

1、ListView item與item中的控件搶焦點的問題(必須設定CheckBox不可點選和不能擷取焦點,讓ListView得到焦點)

2、ListView的setChoicMode(int choiceMode)選擇模式():有choiceMode : CHOICE_MODE_NONE, CHOICE_MODE_SINGLE, or CHOICE_MODE_MULTIPLE分别是不可選、單選、多選

3、點選ListView item時,反轉CheckBox的狀态,mCheckBox.toggle();

說到這,可以知道ListView實作複選框的邏輯還是比較簡單的,針對第一個問題,為什麼需要讓CheckBox失去焦點呢?因為像系統預設可點選的控件如Button、CheckBox、ImageButton等或者它們的子控件,相對其它預設不可點選的控件具有更高的優先級,是以在和其它控件一起使用中它們會優先獲得焦點,是以如果不設定CheckBox失去焦點,那麼ListView就不可點選了,隻能點選CheckBox這個控件。

好了,直接貼一下代碼吧:

這個方法就是顯示一個ListView複選框:

private void showAllAppInfo() {
		View view = LayoutInflater.from(this).inflate(R.layout.show_appinfo,
				null);
		ListView mListView = (ListView) view
				.findViewById(R.id.show_appinfo_listview);
		Button mBtnCancel = (Button) view
				.findViewById(R.id.show_appinfo_cancel);
		Button mBtnSubmit = (Button) view
				.findViewById(R.id.show_appinfo_submit);
		final MyAdapter adapter = new MyAdapter();
		mListView.setAdapter(adapter);
		mListView.setItemsCanFocus(true);// 讓item得到焦點,【注意】必須将ListView的item布局中的Checkbox控件失去焦點
		mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);// 設定多選模式
		mListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				ViewHolder holder = (ViewHolder) view.getTag();// 得到目前點選的View的ViewHolder對象
				holder.mCheckBox.toggle();// 當點選時設定相反的狀态
				adapter.mCheckBoxSelected.put(position,
						holder.mCheckBox.isChecked());//修改Hashmap中對應位置Checkbox的選中情況
			}
		});
		Display display = getWindowManager().getDefaultDisplay();
		Point outSize = new Point();
		display.getSize(outSize);
		int width = outSize.x;
		int height = outSize.y;
		final PopupWindow pop = new PopupWindow(view, width * 3 / 4,
				height * 4 / 5, true);
		WindowManager.LayoutParams params = getWindow().getAttributes();
		params.alpha = 0.6f;
		getWindow().setAttributes(params);
		mBtnSubmit.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				StringBuffer sb = new StringBuffer();
				for (int i = 0; i < adapter.appInfoList.size(); i++) {
					// 循環周遊集合,得到選擇item的資訊
					if (adapter.mCheckBoxSelected.get(i)) {
						String selectedAppName = adapter.appInfoList.get(i)
								.getAppName();
						// Drawable selectedAppIcon = adapter.appInfoList.get(i).getAppIcon();
						sb.append(selectedAppName+",");
					}
				}
				pop.dismiss();
				Toast.makeText(getApplicationContext(), sb.toString(),
						Toast.LENGTH_SHORT).show();
			}
		});
		mBtnCancel.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				pop.dismiss();
			}
		});
		pop.setOnDismissListener(new OnDismissListener() {
			@Override
			public void onDismiss() {
				WindowManager.LayoutParams params = getWindow()
						.getAttributes();
				params.alpha = 1.0f;
				getWindow().setAttributes(params);
			}
		});
		pop.setBackgroundDrawable(new BitmapDrawable());
		pop.setOutsideTouchable(true);
		pop.setAnimationStyle(R.style.showPopupAnimation);
		pop.showAtLocation(view, Gravity.CENTER, 0, 0);
	}
           

重寫擴充卡,Myadapter.java

public class MyAdapter extends BaseAdapter {
		public List<AppInfo> appInfoList;
		public HashMap<Integer, Boolean> mCheckBoxSelected;

		public MyAdapter() {
			appInfoList = getSystemAppInfo();
			mCheckBoxSelected = new HashMap<Integer, Boolean>();
			for (int i = 0; i < appInfoList.size(); i++) {
				mCheckBoxSelected.put(i, false);//初始化, 預設不選中
			}
		}

		@Override
		public int getCount() {
			return appInfoList.size();
		}

		@Override
		public Object getItem(int position) {

			return appInfoList.get(position);
		}

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder viewHolder;
			if (convertView == null) {
				viewHolder = new ViewHolder();
				convertView = LayoutInflater.from(MainActivity.this).inflate(
						R.layout.listview_item, null, true);
				viewHolder.mImgAppIcon = (ImageView) convertView
						.findViewById(R.id.listview_item_img);
				viewHolder.mTvAppName = (TextView) convertView
						.findViewById(R.id.listview_item_tv);
				viewHolder.mCheckBox = (CheckBox) convertView
						.findViewById(R.id.listview_item_cbx);
				convertView.setTag(viewHolder);
			} else {
				viewHolder = (ViewHolder) convertView.getTag();
			}
			viewHolder.mImgAppIcon.setImageDrawable(appInfoList.get(position)
					.getAppIcon());
			viewHolder.mTvAppName.setText(appInfoList.get(position)
					.getAppName());
			viewHolder.mCheckBox.setChecked(mCheckBoxSelected.get(position));
			return convertView;
		}

	}
           

ViewHolder類:

public final static class ViewHolder {
		ImageView mImgAppIcon;
		TextView mTvAppName;
		CheckBox mCheckBox;
	}
           

得到系統内非系統app:

// 得到非系統應用清單
	private List<AppInfo> getSystemAppInfo() {
		List<AppInfo> list = new ArrayList<AppInfo>();
		List<PackageInfo> packages = this.getPackageManager()
				.getInstalledPackages(0);
		AppInfo appInfo = null;
		for (PackageInfo temp : packages) {
			if ((temp.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
				// 非系統應用
				String appName = (String) temp.applicationInfo
						.loadLabel(getPackageManager());
				Drawable appIcon = temp.applicationInfo
						.loadIcon(getPackageManager());
				appInfo = new AppInfo(appIcon, appName);
				list.add(appInfo);
				appInfo = null;
			} else {
				// 系統應用
			}
		}
		return list;
	}
           

當然還有一個JavaBean類:AppInfo.java,這個類的代碼就不貼了。

源碼下載下傳請戳:http://download.csdn.net/detail/u010687392/8702343

Android實戰之ListView複選框
Android實戰之ListView複選框
Android實戰之ListView複選框

繼續閱讀