有时候项目中的ListView内需要内置一个CheckBox,供用户选择,多选,删除等等
先看源码
DataItem.java
package
com.example.checkboxdemo;
public
class
DataItem {
private
String title;
private
boolean
flag;
public
String getTitle() {
return
title;
}
public
void
setTitle(String title) {
this
.title = title;
}
public
boolean
getFlag() {
return
flag;
}
public
void
setFlag(
boolean
flag) {
this
.flag = flag;
}
}
|
MyAdapter.java
package
com.example.checkboxdemo;
import
java.util.ArrayList;
import
java.util.HashMap;
import
android.content.Context;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.BaseAdapter;
import
android.widget.CheckBox;
import
android.widget.TextView;
import
com.example.checkboxdemo.MainActivity.ViewHolder;
public
class
MyAdapter
extends
BaseAdapter {
public
ArrayList<DataItem> mVideoList;
private
Context context;
private
LayoutInflater mInflater =
null
;
public
MyAdapter(Context context, ArrayList<DataItem> list)
{
this
.context = context;
this
.mVideoList = list;
mInflater = LayoutInflater.from(context);
}
@Override
public
int
getCount() {
return
mVideoList.size();
}
@Override
public
Object getItem(
int
position) {
return
mVideoList.get(position);
}
@Override
public
long
getItemId(
int
position) {
return
position;
}
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
ViewHolder mHolder =
null
;
if
(
null
== convertView)
{
mHolder =
new
ViewHolder();
convertView = mInflater.inflate(R.layout.test_item,
null
);
mHolder.mTitle = (TextView)convertView.findViewById(R.id.item_tv);
mHolder.mCheck = (CheckBox)convertView.findViewById(R.id.item_cb);
convertView.setTag(mHolder);
}
else
{
mHolder = (ViewHolder)convertView.getTag();
}
mHolder.mTitle.setText(mVideoList.get(position).getTitle());
mHolder.mCheck.setChecked(mVideoList.get(position).getFlag());
return
convertView;
}
}
|
MainActivity.java
package
com.example.checkboxdemo;
import
java.util.ArrayList;
import
java.util.HashMap;
import
android.app.Activity;
import
android.os.Bundle;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.AdapterView;
import
android.widget.AdapterView.OnItemClickListener;
import
android.widget.Button;
import
android.widget.CheckBox;
import
android.widget.ListView;
import
android.widget.TextView;
import
android.widget.Toast;
public
class
MainActivity
extends
Activity {
private
ListView mVideoView;
private
MyAdapter mAdapter;
private
ArrayList<DataItem> mVideoList;
private
Button mCheckAllBtn;
private
Button mUnCheckAllBtn;
private
Button mCancelBtn;
private
Button mDeleteItemBtn;
String str[] = {
"item0"
,
"item1"
,
"item2"
,
"item3"
,
"item4"
,
"item5"
,
"item6"
,
"item7"
,
"item8"
,
"item9"
,
"item10"
,
"item11"
,
"item12"
};
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initListeners();
}
private
void
initViews()
{
mVideoView = (ListView)findViewById(R.id.lv);
mCheckAllBtn = (Button)findViewById(R.id.checkAll);
mUnCheckAllBtn = (Button)findViewById(R.id.uncheckAll);
mCancelBtn = (Button)findViewById(R.id.cancelCheck);
mDeleteItemBtn = (Button)findViewById(R.id.deleteItem);
mVideoList =
new
ArrayList<DataItem>();
initData();
}
private
void
initData()
{
for
(
int
i =
0
; i < str.length; i++)
{
DataItem item =
new
DataItem();
item.setTitle(str[i]);
item.setFlag(
false
);
mVideoList.add(item);
}
mAdapter =
new
MyAdapter(
this
, mVideoList);
mVideoView.setAdapter(mAdapter);
}
private
void
initListeners()
{
mCheckAllBtn.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
for
(
int
i =
0
; i < mVideoList.size(); i++)
{
mVideoList.get(i).setFlag(
true
);
}
mAdapter.notifyDataSetChanged();
}
});
mUnCheckAllBtn.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
for
(
int
i =
0
; i < mVideoList.size(); i++)
{
mVideoList.get(i).setFlag(
false
);
}
mAdapter.notifyDataSetChanged();
}
});
mCancelBtn.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
for
(
int
i =
0
; i < mVideoList.size(); i++)
{
if
(mVideoList.get(i).getFlag())
{
mVideoList.get(i).setFlag(
false
);
}
else
{
mVideoList.get(i).setFlag(
true
);
}
}
mAdapter.notifyDataSetChanged();
}
});
mDeleteItemBtn.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
/**
* 这里不能直接操作mVideoList,需要缓存到一个列表中一起清除,否则会出现错误
*/
ArrayList<DataItem> deleteList =
new
ArrayList<DataItem>();
for
(
int
i =
0
; i < mVideoList.size(); i++)
{
if
(mVideoList.get(i).getFlag())
{
deleteList.add(mVideoList.get(i));
}
}
mVideoList.removeAll(deleteList);
deleteList.clear();
mAdapter.notifyDataSetChanged();
}
});
mVideoView.setOnItemClickListener(
new
OnItemClickListener() {
@Override
public
void
onItemClick(AdapterView<?> parent, View view,
int
position,
long
id) {
ViewHolder holder = (ViewHolder)view.getTag();
//改变CheckBox状态
holder.mCheck.toggle();
mAdapter.mVideoList.get(position).setFlag(holder.mCheck.isChecked());
}
});
}
static
class
ViewHolder
{
public
TextView mTitle;
public
CheckBox mCheck;
}
}
|
这里需要注意下面的item的CheckBox定义,如果不加上红色的三行代码,会导致onItemClickListener失效
test_item.xml
<?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=
"wrap_content"
android:gravity=
"center_vertical"
android:orientation=
"horizontal"
>
<TextView
android:id=
"@+id/item_tv"
android:layout_width=
"0dip"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"20dp"
android:layout_weight=
"1"
android:gravity=
"center_vertical"
/>
<CheckBox
android:id=
"@+id/item_cb"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
<strong> <span style=
"color: #ff0000;"
> android:clickable=
"false"
android:focusable=
"false"
android:focusableInTouchMode=
"false"
</span></strong>
android:gravity=
"center_vertical"
/>
</LinearLayout>
|
说的不多,全在代码里,有图有真相