ListView+checkBox刪除需求實現以及注意事項

一、概述

一般項目都會有刪除的功能,一般都會用到checkbox,通過點擊checkbox選擇要選擇的條目,並且item也可以點擊,點擊後,可以進到條目的詳情,例如新聞類似的。

二、效果截圖



三、實現過程

1、自定義條目layout( android:descendantFocusability="blocksDescendants"此屬性比較重要,最後總結會提到

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:padding="10dp" >

    <TextView
        android:id="@+id/id_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:padding="10dp"
        android:textColor="@android:color/black"
        android:textIsSelectable="true"
        android:textSize="15sp" >
    </TextView>

    <CheckBox
        android:id="@+id/id_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

</RelativeLayout>

2、自定義adapter(ViewHolder,就綁定的兩個控件,代碼就不貼出了)

@Override
		public View getView(final int position, View convertView,
				ViewGroup parent)
		{
			ViewHolder holder = null;
			if (convertView == null)
			{
				convertView = View.inflate(context,
						R.layout.listview_item, null);
				holder = new ViewHolder();
				holder.textView = (TextView) convertView
						.findViewById(R.id.id_text);
				holder.checkBox = (CheckBox) convertView
						.findViewById(R.id.id_checkbox);
				convertView.setTag(holder);
			} else
			{
				holder = (ViewHolder) convertView.getTag();
			}

			holder.textView.setText(list.get(position).get("itemTitle"));
			if ("No".equals(list.get(position).get("isChecked")))
			{
				holder.checkBox.setChecked(false);
			} else
			{
				holder.checkBox.setChecked(true);
			}
			/**
			 * 這裏一定要處理checkbox的點擊事件而非setOnCheckedChangeListener,那樣做不起作用會出錯
			 */
			holder.checkBox.setOnClickListener(new OnClickListener()
			{

				@Override
				public void onClick(View v)
				{
					CheckBox checkBox = (CheckBox) v
							.findViewById(R.id.id_checkbox);
					if ("No".equals(list.get(position).get("isChecked")))
					{
						//通過點擊改變選中狀態以及改變list裏面相應的值
						checkBox.setChecked(true);
						list.get(position).put("isChecked", "Yes");

					} else
					{

						checkBox.setChecked(false);
						list.get(position).put("isChecked", "No");
					}
					//然後再更新界面就可以了
					notifyDataSetChanged();
				}
			});
			return convertView;
		}
3、全選點擊事件:

selectAll.setOnClickListener(new OnClickListener()
		{

			@Override
			public void onClick(View v)
			{
				if (isSelectAll)
				{
					isSelectAll = false;
					selectAll.setText("全選");
					for (Map<String, String> map : list)
					{
						map.put("isChecked", "No");
					}

				} else
				{
					isSelectAll = true;
					selectAll.setText("全不選");
					for (Map<String, String> map : list)
					{
						map.put("isChecked", "Yes");
					}

				}
				adapter.notifyDataSetChanged();
			}
		});
4、delete按鈕點擊事件

// 刪除按鈕點擊事件
		delete.setOnClickListener(new OnClickListener()
		{

			@Override
			public void onClick(View v)
			{
				// 注意點:在每次點擊時清除存取正在被選中的item position,要不然,每次點擊可能會重複添加
				selectedPositiones.clear();
				for (int i = 0; i < list.size(); i++)
				{
					if ("Yes".equals(list.get(i).get("isChecked")))
					{
						Map<String, Integer> map = new HashMap<String, Integer>();
						map.put("selectedPosition", i);
						selectedPositiones.add(map);
					}
				}
				// 當存取已選擇的條目集合大於0時,展示dialog對話框,反之提醒用戶選擇想要刪除的條目
				if (selectedPositiones.size() > 0)
					initMyDialog();
				else
					Toast.makeText(context, "請選擇您要刪除的項目!", Toast.LENGTH_SHORT)
							.show();

			}

		});

5、刪除方法

private void deleteWay()
	{
		if (isSelectAll)
		{
			// 刪除全部
			list.clear();
			Toast.makeText(context, "全部刪除成功", Toast.LENGTH_SHORT).show();
		} else
		{
			// 刪除單個或一組,倒敘以此刪除,可以避免併發修改異常
			for (int i = list.size() - 1; i > -1; i--)
			{
				if ("Yes".equals(list.get(i).get("isChecked")))
				{
					list.remove(i);
				}
			}

		}
		adapter.notifyDataSetChanged();
	}
6、dialog加載方式參考我的另一篇文章《圓角dialog》

四、總結以及注意點

注意:

1、 android:descendantFocusability="blocksDescendants"   這個屬性很重要,需要在listview_item.xml根控件添加,如果不添加,會造成setOnItemclickListener事件失效,那爲什麼會這樣呢?

      是因爲item裏面如果有button或者checkbox他們會優先搶佔焦點,所以listview的item點擊事件就無法發生效用,這個屬性又是什麼意思呢?

屬性的值有三種:

        beforedescendants:viewgroup會優先其子類控件而獲取到焦點

        afterdescendants:viewgroup只有當其子類控件不需要獲取焦點時才獲取焦點

        blocksdescendants:viewgroup會覆蓋子類控件而直接獲得焦點

而我們選擇的第三個,就可以解決我們的問題

2、注意的點就是每次點擊時用於存取是否選中的list集合都要先清空,要不然就會出錯

總結:計算機思維方式很重要,繼續努力吧,有問題隨時問我


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章