<ListView
//设定缓存时的颜色
android:cacheColerHint="#00000000"
//设定分隔线的颜色
android:divider=""
//设定分隔线的宽度
android:dividerHeight=""
这个与下面的不同之处在与没有设置存入CheckBox状态的数组,而是在fruit类中添加了一个boolean类型的变量,来村不同的状态。(重点在下面
- 列表内容
)
先创建Listview布局
只含有list布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
fruit的单条布局
<?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">
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:text="请选择"/>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
创建fruit类
public class Fruit {
private String name;
private boolean checkBox;
private int imageView;
public Fruit(String name, int imageView) {
this.name = name;
this.imageView = imageView;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean getCheckBox() {
return checkBox;
}
public void setCheckBox(boolean checkBox) {
this.checkBox = checkBox;
}
public int getImageView() {
return imageView;
}
public void setImageView(int imageView) {
this.imageView = imageView;
}
}
创建适配器
package com.test.dukang.fruit;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;
/**
* Created by Administrator on 2015/8/25.
*/
public class FruitAdapter extends BaseAdapter {
private boolean mAllCheckStation[];
public FruitAdapter(List<Fruit> mList, LayoutInflater inflater) {
this.mList = mList;
this.inflater = inflater;
mAllCheckStation=new boolean[mList.size()];
}
private List<Fruit> mList;
private LayoutInflater inflater;
public void itemSelect(int position){
mAllCheckStation[position]=!mAllCheckStation[position];
notifyDataSetChanged();
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder=null;
int count=0;
if(convertView==null){
convertView=inflater.inflate(R.layout.fruit,null);
viewHolder=new ViewHolder();
viewHolder.name= (TextView) convertView.findViewById(R.id.textView);
viewHolder.imageView= (ImageView) convertView.findViewById(R.id.image);
viewHolder.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox);
convertView.setTag(viewHolder);
count++;
Log.d("data",""+count);
}else {
count++;
Log.d("data",""+count);
viewHolder= (ViewHolder) convertView.getTag();
}
Fruit fuit=mList.get(position);
viewHolder.imageView.setImageResource(fuit.getImageView());
viewHolder.name.setText(fuit.getName());
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.d("data", "发生变化" + isChecked);
mList.get(position).setCheckBox(isChecked);
mAllCheckStation[position]=isChecked;
notifyDataSetChanged();
}
});
// //mAllCheckStation[position]
// viewHolder.checkBox.setChecked(fuit.getCheckBox());
viewHolder.checkBox.setChecked(mAllCheckStation[position]);
return convertView;
}
class ViewHolder{
TextView name;
ImageView imageView;
CheckBox checkBox;
}
}
主程序
package com.test.dukang.fruit;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<Fruit> list;
private ListView listView;
private FruitAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=new ArrayList<>();
init();
listView= (ListView) findViewById(R.id.listview);
LayoutInflater inflater=getLayoutInflater();
adapter = new FruitAdapter(list,inflater);
listView.setAdapter(adapter);
//设置使其点击listView的一条就可以操作CheckBox
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.itemSelect(position);
}
});
}
public void init(){
for (int i=0;i<30;i++) {
Fruit fruit = new Fruit("苹果", R.mipmap.clear_after);
Fruit fruit2 = new Fruit("西瓜", R.mipmap.m);
Fruit fruit3 = new Fruit("黄瓜", R.mipmap.ic_launcher);
list.add(fruit);
list.add(fruit2);
list.add(fruit3);
}
}
}
现有阶段全部功能的BroadAdapter带有CheckBox的。
ListView布局(activity_main.xml)
只含有ListView布局,其他功能参考博客开始时的内容
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
Fruit布局(fruit.xml)(更改单条背景时修改此地方)
设置单条显示的形式
<!--添加此条可以是单条View的整条框都可以被点击-->
android:focusable="false"
<?xml version="1.0" encoding="utf-8"?>
<!--给LinearLayout添加背景,设置选中未选中状态-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:text="请选择"/>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Footer布局(footer.xml)(本例中把footer和header引入时,放反了。)
在ListView的下面添加一个不同于之前的布局,此例只放了一个Button,
<?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">
<!--记得给组件添加id-->
<Button
android:id="@+id/checkAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全选"/>
</LinearLayout>
Header布局(header.xml)
在ListView的上面添加一个不同于之前的布局,此例只放了一个Button,
<?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">
<Button
android:id="@+id/checkfan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="反选"/>
</LinearLayout>
Fruit类(Fruit)
一个简单的Fruit类
package com.test.dukang.fruit;
import android.media.Image;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Created by Administrator on 2015/8/25.
*/
public class Fruit {
private String name;
private boolean checkBox;
private int imageView;
public Fruit(String name, int imageView) {
this.name = name;
this.imageView = imageView;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean getCheckBox() {
return checkBox;
}
public void setCheckBox(boolean checkBox) {
this.checkBox = checkBox;
}
public int getImageView() {
return imageView;
}
public void setImageView(int imageView) {
this.imageView = imageView;
}
}
FruitAdapter(适配类,可谓精髓)
package com.test.dukang.fruit;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;
/**
* Created by Administrator on 2015/8/25.
*/
public class FruitAdapter extends BaseAdapter {
//创建Fruit的集合类
private List<Fruit> mList;
//得到主布局中的内容填充器
private LayoutInflater inflater;
//用一个数组来保存所有CheckBox的状态
private boolean mAllCheckStation[];
public FruitAdapter(List<Fruit> mList, LayoutInflater inflater) {
this.mList = mList;
this.inflater = inflater;
//用list的长度来设定数组的长度
mAllCheckStation=new boolean[mList.size()];
}
/**
*添加全选的方法
*/
public void itemCheckAll(){
for (int i = 0; i <mAllCheckStation.length ; i++) {
mAllCheckStation[i]=true;
//更改后立即更新
notifyDataSetChanged();
}
}
/**
*添加反选的方法
*/
public void itemCheckFan() {
for (int i = 0; i <mAllCheckStation.length ; i++) {
mAllCheckStation[i]=!mAllCheckStation[i];
notifyDataSetChanged();
}
}
/**
*添加单击一条时可以选中CheckBox
*/
public void itemSelect(int position){
//通过position得到需要的数据
mAllCheckStation[position]=!mAllCheckStation[position];
notifyDataSetChanged();
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//添加自定义的缓存区
ViewHolder viewHolder=null;
if(convertView==null){
"望不要忘了写该句,给covertView传入值"
//covertView为传递过来的View
convertView=inflater.inflate(R.layout.fruit,null);
//用缓存器去得到id
"也不要忘了初始化自定义的对象"
viewHolder=new ViewHolder();
viewHolder.name= (TextView) convertView.findViewById(R.id.textView);
viewHolder.imageView= (ImageView) convertView.findViewById(R.id.image);
viewHolder.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox);
//注意设置标志位
convertView.setTag(viewHolder);
}else {
//得到标志位,避免再一次获取id
viewHolder= (ViewHolder) convertView.getTag();
}
//得到集合中的数据
Fruit fuit=mList.get(position);
viewHolder.imageView.setImageResource(fuit.getImageView());
viewHolder.name.setText(fuit.getName());
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
//设置点击意图
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.d("data", "发生变化" + isChecked);
mList.get(position).setCheckBox(isChecked);
//将CheckBox的状态值存入数组
mAllCheckStation[position]=isChecked;
//立即刷新界面
notifyDataSetChanged();
}
});
这些是在程序中注释的不要在意
// //mAllCheckStation[position]
// //viewHolder.checkBox.setChecked(fuit.getCheckBox());
viewHolder.checkBox.setChecked(mAllCheckStation[position]);
//注意返回值
return convertView;
}
/**
*自己添加的ViewHolder类
*/
class ViewHolder{
TextView name;
ImageView imageView;
CheckBox checkBox;
}
}
MainActivity
package com.test.dukang.fruit;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
//将要用到的变量设置为全局变量,设置Fruit的集合
private List<Fruit> list;
//设置ListView,以便得到布局中的ListView
private ListView listView;
//得到适配器,以便使用和调用方法
private FruitAdapter adapter;
//得到活动中的inflater
private LayoutInflater inflater;
//下面分别为footer和header的使用,取得其中的控件
private View mHeaderView;
private Button mBtnCheckedAll;
private View mFooterView;
private Button mBtnCheckedfan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//传入带ListView的布局文件
setContentView(R.layout.activity_main);
//创建一个集合,一定要在主类中创建
list=new ArrayList<>();
//初始化数据
init();
//用id得到listView
listView= (ListView) findViewById(R.id.listview);
//得到填充器
inflater=getLayoutInflater();
//用FruitAdapter的构造器,传递所需的参数
adapter = new FruitAdapter(list,inflater);
//设置footer,因为本例中引入反了,
"注意传入的布局"
mHeaderView=inflater.inflate(R.layout.footer,null);
//得到布局中的button
mBtnCheckedAll = (Button) mHeaderView.findViewById(R.id.checkAll);
//给button设置点击事件
mBtnCheckedAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter.itemCheckAll();
}
});
//注意一定要添加到ListView中
listView.addFooterView(mHeaderView);
//用法相同
mFooterView=inflater.inflate(R.layout.header,null);
mBtnCheckedfan= (Button) mFooterView.findViewById(R.id.checkfan);
mBtnCheckedfan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter.itemCheckFan();
}
});
listView.addHeaderView(mFooterView);
//添加适配器
listView.setAdapter(adapter);
//设置一条的点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//通过position传递数据给CheckBox,注意只有当设置Header时,这里的position才减一,注意只有这里的。
"当没有时直接传入position"
adapter.itemSelect(position-1);
}
});
}
/**
*初始化数据
*/
public void init(){
for (int i=0;i<30;i++) {
Fruit fruit = new Fruit("苹果", R.mipmap.clear_after);
Fruit fruit2 = new Fruit("西瓜", R.mipmap.m);
Fruit fruit3 = new Fruit("黄瓜", R.mipmap.ic_launcher);
list.add(fruit);
list.add(fruit2);
list.add(fruit3);
}
}
}