ListView 自身提供了 CheckBox 只需要添加一行代码
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
但是这种实现想要自己控制操作起来局限很多。所以我选择了自己添加CheckBox的方式。可以支持列表项的全选,删除,并保持数据的对应关系不会乱。
列表中的CheckBox选中状态与一个Map进行绑定,利用 adapter.notifyDataSetChanged();来更新界面。
效果如下:
下面直接看代码把。
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#C9F1FF">
<ListView
android:id="@id/android:list"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:fadingEdge="none"
android:cacheColorHint="#00000000"/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="40.0dip"
android:layout_alignParentBottom="true">
<CheckBox android:id="@+id/all_check_btn"
android:layout_width="40.0dip"
android:background="@drawable/bottom_back_bg"
android:layout_height="40.0dip"
android:layout_alignParentLeft="true"/>
</RelativeLayout>
</RelativeLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_marginRight="3.0dip" android:layout_weight="1.0"
android:orientation="horizontal" android:descendantFocusability="blocksDescendants">
<CheckBox android:id="@+id/isCheakBox" android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentLeft="true" />
<!-- 日报图片 -->
<ImageView android:id="@+id/dailyPic" android:contentDescription="dailyPic"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="3.0dip" android:src="@drawable/reports"
android:layout_toRightOf="@id/isCheakBox" android:layout_centerVertical="true"/>
<!--附件名称 -->
<TextView
android:id="@+id/dailyName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/dailyPic"
android:text="日报名称" android:layout_centerVertical="true"
android:textColor="#000000"
android:textSize="12.0sp" />
<ImageButton android:id="@+id/deleteAttachment"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="3.0dip" android:background="@drawable/delete"
android:layout_centerVertical="true" android:focusable="false"
android:layout_alignParentRight="true" android:layout_marginRight="20dp"/>
<!--附件名称 -->
</RelativeLayout>
Activity代码
public class ListViewCheckBoxActivity extends ListActivity {
private static final String TAG = "ListViewCheckBoxActivity";
private List<Item> itemList;
private DraftDailyAdapter adapter;
private Map<Integer, Boolean> isCheckedMap;
private CheckBox allCheckBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
allCheckBox = (CheckBox)findViewById(R.id.all_check_btn);
itemList = new ArrayList<Item>();
isCheckedMap = new HashMap<Integer, Boolean>();
//初始化数据
for(int i=0;i<8;i++){
Item item = new Item();
item.id=i;
item.name = "第"+i+"篇日报";
itemList.add(item);
isCheckedMap.put(i,false);
}
adapter = new DraftDailyAdapter(this,itemList);
setListAdapter(adapter);
allCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Set<Integer> set = isCheckedMap.keySet();
Iterator<Integer> iterator = set.iterator();
if(isChecked){
while(iterator.hasNext()){
Integer keyId = iterator.next();
isCheckedMap.put(keyId,true);
}
}else{
while(iterator.hasNext()){
Integer keyId = iterator.next();
isCheckedMap.put(keyId,false);
}
}
adapter.notifyDataSetChanged();
}
});
}
class DraftDailyAdapter extends BaseAdapter {
public List<Item> list;
private Context context;
LayoutInflater inflater;
public DraftDailyAdapter(Context context, List<Item> list) {
super();
this.list = list;
this.context = context;
inflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return list == null ? 0 : list.size();
}
@Override
public Object getItem(int location) {
return list.get(location);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
Item item = list.get(position);
//Item的位置
final int listPosition = position;
//这个记录item的id用于操作isCheckedMap来更新CheckBox的状态
final int id = item.id;
if(convertView == null){
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item, null);
holder.tvName = (TextView)convertView.findViewById(R.id.dailyName);
holder.deleteButton = (ImageButton)convertView.findViewById(R.id.deleteAttachment);
holder.cBox = (CheckBox)convertView.findViewById(R.id.isCheakBox);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
Log.d(TAG, "id="+id);
holder.cBox.setChecked(isCheckedMap.get(id));
holder.tvName.setText(item.name);
holder.deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View paramView) {
//Log.d(TAG, "deletePosition="+listPosition+"");
//删除list中的数据
list.remove(listPosition);
//删除Map中对应选中状态数据
isCheckedMap.remove(id);
//通知列表数据修改
adapter.notifyDataSetChanged();
}
});
holder.cBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
isCheckedMap.put(id,true);
}else{
isCheckedMap.put(id,false);
}
}
});
return convertView;
}
public final class ViewHolder {
public TextView tvName;
public ImageButton deleteButton;
public CheckBox cBox;
}
}
class Item {
private Integer id;
private String name;
}
}
资源文件见附件源代码。
- 大小: 76.7 KB
分享到:
相关推荐
本篇文章将深入讲解如何在Android中实现ListView带有CheckBox的功能,包括点击选择、反选、全选和全不选,以及实时显示已选择数量。 1. **ListView基本使用** - ListView是Android中用于显示一列可滚动项目的视图...
在实际项目中,我们经常需要实现一个功能,即在ListView中加入CheckBox,让用户能够通过一个主CheckBox来控制所有子项CheckBox的选择状态,这就是所谓的全选/反选联动。在本文中,我们将深入探讨如何在WPF的MVVM...
综上所述,这个“android ListView中的checkBox全选和反选Demo”主要展示了如何在ListView中集成CheckBox,实现列表项的全选和反选功能,以及如何优化Adapter以提高性能。理解并掌握这些知识点对于Android开发者来说...
总之,这份源码示例涵盖了Android开发中常见的ListView与CheckBox结合使用场景,包括全选、全不选和删除功能的实现,对于初学者和有经验的开发者来说都是一个很好的学习资源。通过深入研究并理解这些代码,可以提升...
此源码示例主要涉及了ListView与CheckBox结合的高级应用,实现了全选、全不选以及删除功能,这些都是在开发中经常遇到的需求。下面我们将详细探讨这些知识点。 1. **ListView的基本使用** ListView是Android中用于...
综上所述,这个"listview+checkbox选中删除,全选,item点击"的Demo涉及到Android开发中的多项核心技能,包括UI组件的使用、数据绑定、事件监听以及性能优化等。开发者需要对这些知识有深入理解才能成功实现这样的...
在Android开发中,ListView是一种常用的控件,用于展示大量数据列表。为了增加用户交互性,我们经常会在ListView的每一项中添加CheckBox,这样用户就可以进行多选操作。本篇文章将详细讲解如何在ListView中实现...
10. **源码分析**: 通过阅读和分析源码,开发者可以学习如何处理ListView与CheckBox的交互,以及如何在实际项目中实现全选、全不选和删除等功能,这对于提升Android应用开发技能大有裨益。 综上所述,这个示例代码...
综上所述,这个源码示例展示了如何在Android应用中实现一个具有全选、全不选和删除功能的ListView+CheckBox UI。通过理解并实践这些知识点,开发者可以更好地掌握Android界面交互设计及数据管理的方法。
在安卓开发中,ListView是常用的一种...总之,这个教程涵盖了安卓开发中常见的ListView和CheckBox结合使用场景,通过源码示例,帮助开发者实现全选、全不选及删除功能,对于理解和掌握安卓UI设计有着积极的指导作用。
在这个"ListView+CheckBox UI 完美版"项目中,开发者结合了这两者,创建了一个功能丰富的界面,支持全选、全不选以及删除等功能。这对于构建具有交互性的应用,尤其是需要用户进行批量操作的场景非常有用。 首先,...
在许多场景下,我们需要在ListView中加入复选框(CheckBox),实现多选、全选和反选的功能,例如在选择联系人、设置菜单等场景。这个“带CheckBox的listView”项目就是为了解决这类需求而设计的,并且已经解决了常见...
实现 全选 、 全不选 、 删除等功能.zip"提供了一个完整的示例,展示了如何在ListView中集成CheckBox,以实现用户交互功能,如全选、全不选以及删除等操作。下面我们将详细讨论这些知识点。 1. **ListView基础知识*...
本项目"安卓开发-ListView+CheckBox UI 完美版"旨在实现一个功能完善的ListView,其中包括CheckBox元素,以支持全选、全不选以及删除等功能。下面我们将详细探讨这些关键知识点。 1. **ListView的基本使用** - `...
实现 全选 、 全不选 、 删除等功能项目安卓应用源码Android应用源码之ListView+CheckBox UI 完美版。实现 全选 、 全不选 、 删除等功能项目安卓应用源码 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3....
本教程将详细讲解如何在ListView中实现带可全选、全不选以及删除功能的复选框(Checkbox),确保在操作过程中列表项不会错位。 一、ListView的基本使用 1. 创建ListView:首先,在布局文件中添加ListView控件,并...
`AndroidListView全选功能,非CheckBox`这个主题是关于如何实现ListView中的全选功能,但不使用传统的CheckBox控件。这种实现方式可能是通过自定义Adapter和单个选择状态管理来达到目的。下面将详细介绍这个功能的...