checkbox是个多选框,它有两种监听,一种是
状态监听事件,主要是对状态的改变进行监听,
setOnCheckedChangeListener一种是点击事件,主要对checkbox的点击进行监听
setOnClickListener这两个的区别在于: 当使用setoncheckedchangelistener监听时,当在别的监听中改变checkbox的状态,这样也会走 setoncheckedchangelistener里面的方法。而点击事件是,只要你点击才会走监听里面的方法,否则不会。
checkbox的全选以及反选,还有个别详细操作,在做这个的时候,如果适配器和那些主控件,和listview在一个类中时,很好做,如果,分开的话,注意,这时候需要把控件传过去,或者写个接口。
如下是 适配器和listview分两个类的做法:
这是主activity的布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" > <com.bawei.swiperefreshlayoutlibrary.SwipyRefreshLayout android:id="@+id/swipy" android:layout_width="match_parent" android:layout_height="wrap_content" > <ListView android:id="@+id/list_activity" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </com.bawei.swiperefreshlayoutlibrary.SwipyRefreshLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="@android:color/white" android:gravity="center_vertical" android:orientation="horizontal"> <CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:button="@drawable/selector_checkbox"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:textSize="20sp" android:text="全选"/> </LinearLayout> </RelativeLayout>//这是适配器里的布局:
<?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"> <CheckBox android:id="@+id/item_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:button="@drawable/selector_checkbox" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:orientation="vertical"> <TextView android:id="@+id/text_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="rtyui" android:textSize="20sp"/> <ImageView android:id="@+id/image_url" android:layout_width="100dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher"/> </LinearLayout> </LinearLayout>//这是主activity的界面:
package liujianrui.bawei.com.checboxvolley.activity; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ListView; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.bawei.swiperefreshlayoutlibrary.SwipyRefreshLayout; import com.bawei.swiperefreshlayoutlibrary.SwipyRefreshLayoutDirection; import com.google.gson.Gson; import java.util.ArrayList; import java.util.List; import liujianrui.bawei.com.checboxvolley.Bean.Lead; import liujianrui.bawei.com.checboxvolley.Bean.Leader; import liujianrui.bawei.com.checboxvolley.R; import liujianrui.bawei.com.checboxvolley.utils.Myadpter; public class MainActivity extends AppCompatActivity { private SwipyRefreshLayout swipy; private ListView list_activity; public static CheckBox checkBox; private Handler handler = new Handler(); private int startNum=1; private List<Lead> list_lead=new ArrayList<>(); private Myadpter m1; private Boolean b1; int a=1; private Boolean b=true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initview(); getdata(); swipy.setColorSchemeColors(R.color.colorPrimaryDark); swipy.setDirection(SwipyRefreshLayoutDirection.BOTH); swipy.setOnRefreshListener(new SwipyRefreshLayout.OnRefreshListener() { @Override public void onRefresh(int index) { //checkBox.setChecked(false); startNum=0; getdata(); handler.postDelayed(new Runnable() { @Override public void run() { swipy.setRefreshing(false); } }, 2000); } @Override public void onLoad(int index) { checkBox.setChecked(false); startNum++; getdata(); handler.postDelayed(new Runnable() { @Override public void run() { swipy.setRefreshing(false); } }, 2000); } }); checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean falg = ((CheckBox) v).isChecked(); if(falg) { for (int i=0;i<list_lead.size();i++) { list_lead.get(i).setB1(true); } m1.notifyDataSetChanged(); } else{ for (int i=0;i<list_lead.size();i++) { list_lead.get(i).setB1(false); } m1.notifyDataSetChanged(); } } }); } private void initview() { swipy = (SwipyRefreshLayout) findViewById(R.id.swipy); list_activity = (ListView) findViewById(R.id.list_activity); checkBox = (CheckBox) findViewById(R.id.checkbox); } private void getdata(){ //获取请求队列 RequestQueue queue = Volley.newRequestQueue(this); Log.i("kkkkk",startNum+""); String url = "http://www.93.gov.cn/93app/data.do?" + "channelId=" + 0 + "&startNum=" + startNum; //http://www.93.gov.cn/93app/data.do?channelId=0&startNum=1 Log.i("xxx", url.toString()); //创建StringRequest StringRequest request = new StringRequest(url, new Response.Listener<String>() { //响应成功 @Override public void onResponse(String s) { Log.i("xxx", s.toString()); Gson g1=new Gson(); Leader leader = g1.fromJson(s, Leader.class); List<Leader.DataBean> data = leader.getData(); for (int i=0;i<data.size();i++) { String imageurl = (String) data.get(i).getIMAGEURL(); String title = data.get(i).getTITLE(); Lead lead=new Lead(); lead.setTitle(title); lead.setUrl(imageurl); lead.setB1(false); list_lead.add(lead); } initListView(list_lead); } }, new Response.ErrorListener() { //响应错误 @Override public void onErrorResponse(VolleyError volleyError) { } }); //把请求方式添加到请求队列 queue.add(request); } private void initListView(List<Lead> lead) { if(m1==null) { m1 = new Myadpter(this, lead,checkBox); list_activity.setAdapter(m1); } else{ m1.notifyDataSetChanged(); } } }//这是myadpter里面的操作:
package liujianrui.bawei.com.checboxvolley.utils; import android.content.Context; import android.util.Log; 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.TextView; import com.squareup.picasso.Picasso; import java.util.ArrayList; import java.util.List; import liujianrui.bawei.com.checboxvolley.Bean.Lead; import liujianrui.bawei.com.checboxvolley.R; import liujianrui.bawei.com.checboxvolley.activity.MainActivity; /** * 姓名 :{刘健瑞} * 2017/4/10 19:38 * 类的注释: */ public class Myadpter extends BaseAdapter { Context context; List<Lead> list_lead; Boolean b1; List<Boolean> list_bo=new ArrayList<>(); public static boolean checked; //声明接口 public CheckBox checbox; //定义接口 public interface OnCheckListener { void onCheck(boolean check); } public Myadpter(Context context, List<Lead> list_lead,CheckBox checbox)//这传了一个控件 { this.context=context; this.list_lead=list_lead; this.checbox=checbox; } @Override public int getCount() { return list_lead.size(); } @Override public Object getItem(int position) { return list_lead.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { viewholder holder = null; if(convertView==null) { convertView=View.inflate(context, R.layout.adpter,null); holder=new viewholder(); holder.text= (TextView) convertView.findViewById(R.id.text_title); holder.image= (ImageView) convertView.findViewById(R.id.image_url); holder.iteam_check= (CheckBox) convertView.findViewById(R.id.item_checkbox); convertView.setTag(holder); } else{ holder= (viewholder) convertView.getTag(); } holder.text.setText(list_lead.get(position).getTitle()); Picasso.with(context).load(list_lead.get(position).getUrl()).into(holder.image); holder.iteam_check.setChecked(list_lead.get(position).getB1()); 这是checkbox的点击监听 holder.iteam_check.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean falg = ((CheckBox) v).isChecked();//得到当前是否为true boolean f=true; if(!falg){ list_lead.get(position).setB1(false); }else{ list_lead.get(position).setB1(true); } //这是判断:list_lead集合里的boolean是否全是true for(int i =0;i<list_lead.size();i++){ if(!list_lead.get(i).getB1()){ f=false; //只要有一个是false,那就把总的checkbox设置成false checbox.setChecked(false); return; } } //在这判断f,如果自己点击,全部设置true,那么总的checkbox就是true if(f){ checbox.setChecked(true); } } }); //把这个重新赋值写一遍的意思就是: 如果list_lead.get(position).getB1()状态一样,它就会覆盖,如果不一样,它复用的时候,后面的就会覆盖 前面的。
holder.iteam_check.setChecked(list_lead.get(position).getB1()); return convertView; } class viewholder{ TextView text; ImageView image; CheckBox iteam_check; }}