ListView中的CheckBox相信大家都不会陌生了,基本都会遇到,类似于全选,提交所选择的数据
这是我实际项目中的界面,未做修饰,请随意吐槽界面,哈哈
相对应的item中也会存在CheckBox,图就不上了
直接上item文件的代码
android:descendantFocusability="blocksDescendants"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
<!--注意这句话,最好是加上-->
android:descendantFocusability="blocksDescendants" >
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#FFFFFF" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#EAEBEC"
android:gravity="center_vertical"
android:paddingBottom="4dp"
android:paddingTop="4dp" >
<LinearLayout
android:id="@+id/layout_chb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#EAEBEC"
android:gravity="center_vertical|right"
android:visibility="gone"
android:orientation="horizontal" >
<CheckBox
android:id="@+id/cb_select"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="10dp"
android:button="@drawable/check_doctor_selector" />
</LinearLayout>
<TextView
android:id="@+id/comp_orderTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textColor="#BDC2C4" />
<TextView
android:id="@+id/comp_orderTime_detail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textColor="#BDC2C4" />
<TextView
android:id="@+id/comp_orderStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:gravity="right"
android:textColor="#BDC2C4" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#FFFFFF" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F6F6F6"
android:orientation="vertical"
android:paddingBottom="4dp"
android:paddingTop="4dp" >
<LinearLayout
android:id="@+id/comp_orderDetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
</LinearLayout>
接下来继续说,全选,多选的问题
很多人都是卡在了这个地方,选中之后,滑动一下,发现选中的都没有了,是不是很奇怪,我第一次接触的时候,也是这样的,别着急,让我们分析下为什么
这是因为滑动过程中重绘了整个界面,也就是GetView方法中未做出相应记录,从而导致CheckBox的选中效果丢失了,那么我们所需要做的就是记录下CheckBox的选中效果
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final BHMedicalOrders medicalOrders = getItem(position)
final ViewHolder holder
if (convertView == null) {// R.layout.list_compound_item
convertView = layoutInflater.inflate(layoutId, null)
holder = new ViewHolder()
holder.orderTime = (TextView) convertView.findViewById(R.id.comp_orderTime)
holder.layout_cb = (LinearLayout) convertView.findViewById(R.id.layout_chb)
holder.cb_select = (CheckBox) convertView.findViewById(R.id.cb_select)
convertView.setTag(holder)
} else {
holder = (ViewHolder) convertView.getTag()
}
// 这里边的medicalOrders就是界面数据实体,而uploads就是我们的记录
if (uploads != null && uploads.size() > 0 && uploads.contains(medicalOrders)) {
holder.cb_select.setChecked(true)
} else {
holder.cb_select.setChecked(false)
}
holder.cb_select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.cb_select.isChecked()) {
if (!uploads.contains(medicalOrders)) {
uploads.add(medicalOrders)
}
} else {
if (uploads.contains(medicalOrders)) {
uploads.remove(medicalOrders)
}
}
}
})
return convertView
}
当然我们还可以使用Map集合的键值对来记录所选,用Boolean的数组来记录当前数据是否被选中
方法很多,但是原理是一样的,效果也是一样的
最后注意一点,在刷新界面的时候,记得把记录的集合清空,要不然数据会混乱
public void notifyData() {
uploads.clear();
notifyDataSetChanged();
}
今天就写这么多吧,有时间我再弄个动态图,补上来