一、概述
一般項目都會有刪除的功能,一般都會用到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集合都要先清空,要不然就會出錯
總結:計算機思維方式很重要,繼續努力吧,有問題隨時問我