ListView中BaseAdapter使用CheckBox及其细节操作(8.25)
2015-08-25 19:52
447 查看
这个与下面的不同之处在与没有设置存入CheckBox状态的数组而是在fruit类中添加了一个boolean类型的变量来村不同的状态重点在下面
先创建Listview布局
fruit的单条布局
创建fruit类
创建适配器
主程序
现有阶段全部功能的BroadAdapter带有CheckBox的
ListView布局activity_mainxml
Fruit布局fruitxml更改单条背景时修改此地方
Footer布局footerxml本例中把footer和header引入时放反了
Header布局headerxml
Fruit类Fruit
FruitAdapter适配类可谓精髓
MainActivity
)
先创建Listview布局
fruit的单条布局
创建fruit类
创建适配器
主程序
现有阶段全部功能的BroadAdapter带有CheckBox的
ListView布局activity_mainxml
Fruit布局fruitxml更改单条背景时修改此地方
Footer布局footerxml本例中把footer和header引入时放反了
Header布局headerxml
Fruit类Fruit
FruitAdapter适配类可谓精髓
MainActivity
<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); } } }
相关文章推荐
- 【VMCloud云平台】SCVMM进阶篇(一)网络虚拟化(2)
- C hicken and rabbit s
- 关于StartActivityForResult的使用
- reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter' 产生崩溃
- Mysql InnoDB锁
- 静态工场方法代替构造器
- GUI编程笔记(java)03:GUI的组件继承图
- Cannot set up guest memory 'android_arm': Invalid argument 解决方法
- hdu4291-A Short problem(2012 chengdu online )
- 1708: A - B
- 信号通信学习
- C语言进阶:整型提升
- ASP.NET MVC 定义JsonpResult实现跨域请求
- UIView(animation)
- 关于mini2440LCD模块总结
- Wireshark malformed packet
- c++之——————各种变量
- POJ 3862 Asteroids(两个三维凸包的重心到表面最短距离和)
- 输入整数二进制1的个数(剑指)
- 【LeetCode】(204)Count Primes(Easy)