Android2011.03.03 17:32




 


안드로이드용 앱을 개발하면서 많은 샘플을 찾아보고 그것을 적용하여 새로운 무엇인가를 만드는 과정중에 찾기가
너무나 힘든것이 하나 있는데, 그것은 CheckBox를 가지고 있는 ListView 를 구현하는 방법이다.

처음에는 별에별 편법을 다 동원해서 해보았는데 아무리 봐도 정석은 아닌듯....
그래서 초심으로 돌아간 마음으로 새롭게 접근해보았습니다.

일단은 Android Playing With ListView Choice Mode[출처] 안드로이드사이드 - http://www.androidside.com/B46/11861  로 부터의 샘플을 가지고 구현해보았습니다.

LVSample1 은 RadioButton 을 사용한 ArrayAdapter 로 구현한  ListView 샘플입니다.


LVSample2 는 CheckBox를 사용한  ArrayAdapter 로 구현한 ListView 샘플입니다.

마지막 LVSample3은 BaseAdapter 를 상속한 Custom Adapter와 Checkable Interface를 이용한 ListView 구현 샘플입니다.
마지막 LVSample3은 버튼 컨트롤을 사용한 ListView 데이터에 접근하여 조회/추가/삭제를 하는 기능을 보여줍니다.

간단한 LVSample3의 중요 소스는  다음과 같습니다.


* LVSample3.java
public class LVSample3 extends Activity implements OnClickListener {

	private Button btnSearch;
	private Button btnAdd;
	private Button btnDelete;

	private ListView lv;
	private List dataSources;
	private ListAdapter adapter;

	private DialogInterface.OnClickListener deleteYesListener;
	private DialogInterface.OnClickListener deleteNoListener;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.main);

		// For Buttons
		btnSearch = (Button) findViewById(R.id.btnSearch);
		btnSearch.setOnClickListener(this);

		btnAdd = (Button) findViewById(R.id.btnAdd);
		btnAdd.setOnClickListener(this);

		btnDelete = (Button) findViewById(R.id.btnDelete);
		btnDelete.setOnClickListener(this);

		// For Custom ListView
		dataSources = getDataSource();
		adapter = new LVSample3Adapter(dataSources, this);
		this.lv = (ListView) findViewById(R.id.listview);
		this.lv.setAdapter(adapter);
		this.lv.setItemsCanFocus(false);
		this.lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
		// lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

		this.lv.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView adapt, View view, int position, long id) {
				// TODO Auto-generated method stub
				TextView tvTitle = (TextView) view.findViewById(R.id.title);
				TextView tvSummary = (TextView) view.findViewById(R.id.summary);
				String message = "Title: " + tvTitle.getText() + "\n" + "Summary:" + tvSummary.getText();
				ShowMessageBox(LVSample3.this, message);
			}
		});

	}

	@Override
	public void onClick(View view) {
		if (view.getId() == R.id.btnSearch) {
			// long[] checkedItems = this.lv.getCheckItemIds();
			Long[] checkedItems = ((LVSample3Adapter) adapter).getCheckItemIds();
			if (checkedItems == null || checkedItems.length == 0) {
				ShowMessageBox(this, "Selected Items is Nothing.");
				return;
			}

			String message = "";
			for (int index = 0; index < checkedItems.length; index++) {
				long pos = checkedItems[index];
				LVSample3Item item = dataSources.get((int) pos);
				message += String.format("%d[%s, %s]\n", pos, item.getTitle(), item.getSummary());
			}
			ShowMessageBox(this, message);

		} else if (view.getId() == R.id.btnAdd) {
			addDataSource(this.dataSources);
			((LVSample3Adapter) adapter).notifyDataSetChanged();
			ShowMessageBox(this, String.format("All items count is %d.", dataSources.size()));
		} else if (view.getId() == R.id.btnDelete) {
			// long[] checkedItems = this.lv.getCheckItemIds();
			Long[] checkedItems = ((LVSample3Adapter) adapter).getCheckItemIds();
			if (checkedItems == null || checkedItems.length == 0) {
				ShowMessageBox(this, "Selected items is Nothing.");
				return;
			}

			// Dialog Setting
			deleteYesListener = new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int id) {
					// long[] checkedItems = lv.getCheckItemIds();
					Long[] checkedItems = ((LVSample3Adapter) adapter).getCheckItemIds();

					for (int index = checkedItems.length - 1; index >= 0; index--) {
						long pos = checkedItems[index];
						dataSources.remove((int) pos);
					}
					// lv.clearChoices();
					((LVSample3Adapter) adapter).clearChoices();
					((LVSample3Adapter) adapter).notifyDataSetChanged();
					ShowMessageBox(LVSample3.this, String.format("All items count is %d.", dataSources.size()));
				}
			};

			deleteNoListener = new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int id) {
					dialog.cancel();
				}
			};

			ShowMessageYesNo(this, "Delete", "Are you sure you want to delete selected item(s)?", deleteYesListener,
					deleteNoListener);
		}
	}

	private static List getDataSource() {
		List lstItems = new ArrayList();

		for (int i = 0; i < 20; i++) {
			LVSample3Item item = new LVSample3Item("Action" + i, "This is a test mssage.");
			lstItems.add(item);
		}
		return lstItems;
	}

	private static List addDataSource(List dataSources) {
		LVSample3Item item = new LVSample3Item("Added" + dataSources.size(), "This is a added mssage.");
		dataSources.add(item);

		return dataSources;
	}

	private static void ShowMessageBox(Context context, String message) {
		Toast.makeText(context, message, Toast.LENGTH_LONG).show();
	}

	public static void ShowMessageYesNo(Context context, String title, String message,
			DialogInterface.OnClickListener YesListener, DialogInterface.OnClickListener NoListener) {
		AlertDialog.Builder alterBuilder = new AlertDialog.Builder(context);
		alterBuilder.setMessage(message).setCancelable(false).setPositiveButton(android.R.string.yes, YesListener)
				.setNegativeButton(android.R.string.no, NoListener);
		AlertDialog alert = alterBuilder.create();
		// Title for AlertDialog
		alert.setTitle(title);
		// Icon for AlertDialog
		alert.setIcon(R.drawable.icon);
		alert.show();
	}
}


* LVSample3Adapter.java
public class LVSample3Adapter extends BaseAdapter {

	private List itemList;
	private Context context;
	public Hashtable hashConvertView = new Hashtable();

	public LVSample3Adapter(List itemList, Context context) {
		this.itemList = itemList;
		this.context = context;
	}

	public int getCount() {
		return itemList.size();
	}

	public LVSample3Item getItem(int position) {
		return itemList.get(position);
	}

	public long getItemId(int position) {
		return itemList.get(position).getId();
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		LVSample3Item item = itemList.get(position);

		ViewHolder holder;
		if (hashConvertView.containsKey(position) == false) {
			convertView = (com.nalsil.ListViewSample.CheckableRelativeLayout) LayoutInflater.from(context).inflate(
					R.layout.my_list_item3, parent, false);
			holder = new ViewHolder();

			holder.tvTitle = (TextView) convertView.findViewById(R.id.title);
			holder.tvSummary = (TextView) convertView.findViewById(R.id.summary);
			holder.chk = (CheckBox) convertView.findViewById(R.id.check);
			holder.chk.setId(position);
			holder.chk.setOnClickListener(listener);

			convertView.setTag(holder);
			hashConvertView.put(position, convertView);
		} else {
			convertView = (View) hashConvertView.get(position);
			holder = (ViewHolder) convertView.getTag();
		}
		holder.tvTitle.setText(item.getTitle());
		holder.tvSummary.setText(item.getSummary());

		return convertView;
	}

	private final OnClickListener listener = new OnClickListener() {
		public void onClick(View v) {
			if (v instanceof CheckBox) {
				CheckBox chk = (CheckBox) v;

				// switch (chk.getId()) {
				// }
				notifyDataSetChanged();
				// notifyDataSetInvalidated();
			}
		}
	};

	public Long[] getCheckItemIds() {
		if (hashConvertView == null || hashConvertView.size() == 0)
			return null;

		Integer key;
		View view;
		List lstIds = new ArrayList();
		Enumeration e = hashConvertView.keys();
		long index = 0;
		while (e.hasMoreElements()) {
			key = (Integer) e.nextElement();
			view = (View) hashConvertView.get(key);
			ViewHolder holder = (ViewHolder) view.getTag();
			if (holder.chk.isChecked()) {
				lstIds.add(index);
			}
			index++;
		}

		Long[] arrLong = (Long[]) lstIds.toArray(new Long[0]);
		return arrLong;
	}

	public void clearChoices() {
		if (hashConvertView == null || hashConvertView.size() == 0)
			return;

		Integer key;
		View view;
		List lstIds = new ArrayList();
		Enumeration e = hashConvertView.keys();
		long index = 0;
		while (e.hasMoreElements()) {
			key = (Integer) e.nextElement();
			view = (View) hashConvertView.get(key);
			ViewHolder holder = (ViewHolder) view.getTag();
			if (holder.chk.isChecked()) {
				holder.chk.setChecked(false);
			}
			index++;
		}
	}

	static class ViewHolder {
		CheckBox chk;
		TextView tvTitle;
		TextView tvSummary;
	}
}

* LVSample3Item.java
public class LVSample3Item implements Serializable {

	private static final long serialVersionUID = -1586987653093943671L;
	private static long index = 0;
	private long Id = 0;
	private String title;
	private String summary;

	public LVSample3Item(String title, String summary) {
		Id = index++;
		this.title = title;
		this.summary = summary;
	}

	public long getId() {
		return Id;
	}

	public void setId(long Id) {
		this.Id = Id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getSummary() {
		return summary;
	}

	public void setSummary(String summary) {
		this.summary = summary;
	}
}

* main.xml



	

		

		

		
	

	




* my_list_item3.xml



	

	

	

	


신고

'Android' 카테고리의 다른 글

[안드로이드]Wifi Scanning 에 대한 방법  (0) 2014.06.03
Embedded AChartEngine  (2) 2011.04.11
Pick up the phone  (1) 2011.04.08
Android Custom ListView with CheckBox  (7) 2011.03.03
WiFi Monitor  (0) 2011.02.16
Android ImageView ZoomIn/ZoomOut, Move  (0) 2010.05.11




Posted by 금붕어70
TAG ListView
Windows/Dos2011.02.22 13:30




MKLINK [[/D] | [/H] | [/J]] 링크 대상

        /D      디렉터리 기호화된 링크를 만듭니다. 기본값은 파일 심볼
                링크입니다.
        /H      심볼 링크 대신 하드 링크를 만듭니다.
        /J      디렉터리 교차점을 만듭니다.
        링크    새 심볼 링크 이름을 지정합니다.
        대상    새 링크로 참조되는 절대 경로 또는 상대 경로를
                지정합니다.

* UAC  활성화 상태이면 Dos 창을 꼭 관리자 모드로 실행해주세요.

신고




Posted by 금붕어70
Android2011.02.16 17:50




안드로이드 OS 개발 환경을 공부하기 위해 이번에 WiFi Monitor 라는 앱을 출시했다.
가끔씩 죽고 오동작도 하지만 안드로이드를 공부하면서 익혔든 모든 내용을 총 망라했다
시간이 지나면 조금더 조금 더 나아 지리라 기대한다.

URL:   market://details?id=com.nalsil.WiFiMonitor

신고

'Android' 카테고리의 다른 글

[안드로이드]Wifi Scanning 에 대한 방법  (0) 2014.06.03
Embedded AChartEngine  (2) 2011.04.11
Pick up the phone  (1) 2011.04.08
Android Custom ListView with CheckBox  (7) 2011.03.03
WiFi Monitor  (0) 2011.02.16
Android ImageView ZoomIn/ZoomOut, Move  (0) 2010.05.11




Posted by 금붕어70

티스토리 툴바