上一篇博文講解了listview中CheckBox選中混亂的問題,下面我來講listview全選的實現。
我們來理一下思路,以為全選按鈕一般都在主活動中,所以他的選中監聽也只能在主活動中寫,如果在listAdaper中寫的話,程序會報錯,那么如何才能將兩個聯系起來呢?解決方法當然是定義static狀態數組,當在主活動中選中全選按鈕時,改變list中CheckBox的數組,然后刷新listview,這樣不就很好的解決了嗎,下面來看代碼。
主活動的布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/activity_mygouwuche" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.book.MygouwucheActivity"> <LinearLayout android:id="@+id/mygouwuchelayout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/Mygouwuchetoolbar" android:layout_alignParentStart="true"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:layout_below="@+id/Mygouwuchetoolbar" android:layout_alignParentStart="true" android:id="@+id/mygouwuchelistview" /> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="80dp" android:background="#FFFFFFFF" android:layout_alignParentTop="true" android:layout_alignParentEnd="true"> <CheckBox android:layout_marginLeft="15dp" android:text=" 全選" android:layout_width="130dp" android:layout_height="wrap_content" android:id="@+id/mygouwuchecheckBox" android:button="@drawable/checkboxseletor" /> <TextView android:text="合計:" android:textSize="17sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:text="¥" android:textSize="17sp" android:textColor="#FFEC6D23" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView" android:layout_weight="1"/> <Button android:text="購買" android:layout_width="110dp" android:layout_height="60dp" android:textColor="#FFFFFFFF" android:textSize="20sp" android:id="@+id/button" android:background="#FFC90C06" /> </LinearLayout> </LinearLayout> </RelativeLayout>
listview 的布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.book.MainActivity" android:background="#FFFFFFFF"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_marginTop="11dp" android:weightSum="1" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_height="110dp"> <CheckBox android:layout_gravity="center" android:layout_height="match_parent" android:layout_marginLeft="15dp" android:layout_width="30dp" android:id="@+id/Mygouwuchexuanze" android:button="@drawable/checkboxseletor"/> <ImageView app:srcCompat="@color/colorPrimary" android:id="@+id/mygouwuchebook" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:layout_marginLeft="15dp" android:layout_width="70dp" android:layout_height="90dp" /> <LinearLayout android:orientation="vertical" android:layout_height="110dp" android:layout_width="80dp"> <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginLeft="15dp" android:textSize="15sp" android:id="@+id/Mygouwuchebookname" /> <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginLeft="15dp" android:textSize="15sp" android:textColor="@android:color/holo_red_light" android:id="@+id/Mygouwuchebookprice" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_weight="1" android:layout_height="110dp"> <Button android:text="-" android:textSize="40dp" android:layout_height="match_parent" android:id="@+id/Mygouwuchebooknumjian" android:layout_width="30dp" android:background="#FFFFFFFF" style="?android:attr/borderlessButtonStyle" android:textColor="#979696" /> <TextView android:layout_gravity="center" android:layout_marginLeft="5dp" android:textSize="25dp" android:text="1" android:layout_height="wrap_content" android:id="@+id/Mygouwuchebooknum" android:layout_width="30dp" android:textDirection="inherit" /> <Button android:text="+" android:textSize="30dp" android:layout_height="match_parent" android:id="@+id/Mygouwuchebooknumjia" android:layout_width="30dp" android:background="#FFFFFFFF" style="?android:attr/borderlessButtonStyle" android:textColor="#979696" /> <Button android:text="刪除" android:layout_width="wrap_content" android:layout_height="match_parent" android:id="@+id/Mygouwuchebookshanchu" android:background="#FFFFFFFF" android:layout_weight="1" /> </LinearLayout> </LinearLayout> </RelativeLayout>
adapter的代碼:
package com.example.book; import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import org.w3c.dom.Text; import java.util.List; /** * Created by THINK on 2017/10/28. */ public class MygouwuchebookAdapter extends ArrayAdapter<Mygouwuchebookclass> { private int resourseId; private Context context; private boolean[] checks;//定義數組來保存CheckBox的狀態 private String[] booknum; private int length; public MygouwuchebookAdapter(Context context, int textViewResourseId, List<Mygouwuchebookclass> objects) { super(context,textViewResourseId,objects); resourseId=textViewResourseId; this.context=context; checks = new boolean[objects.size()];//初始化數組 booknum=new String[objects.size()]; length=objects.size(); for(int i=0;i<objects.size();i++) { booknum[i]="1"; } } @Override public View getView(final int position, View converView, ViewGroup parent) { Mygouwuchebookclass mygouwuchebookclass=getItem(position); View view; final ViewHolder viewHolder; if(converView==null) { view = LayoutInflater.from(getContext()).inflate(resourseId, parent, false); viewHolder=new ViewHolder(); viewHolder.mygouwuchexuanze=(CheckBox) view.findViewById(R.id.Mygouwuchexuanze); viewHolder.mygouwuchebookimage=(ImageView)view.findViewById(R.id.mygouwuchebook); viewHolder.mygouwuchebookname=(TextView)view.findViewById(R.id.Mygouwuchebookname); viewHolder.mugouwuchebookprice=(TextView)view.findViewById(R.id.Mygouwuchebookprice); viewHolder.mygouwuchebooknum=(TextView)view.findViewById(R.id.Mygouwuchebooknum); viewHolder.mygouwuchebooknumjian=(Button)view.findViewById(R.id.Mygouwuchebooknumjian); viewHolder.mygouwuchebooknumjia=(Button)view.findViewById(R.id.Mygouwuchebooknumjia); viewHolder.mygouwuchebookshanchu=(Button)view.findViewById(R.id.Mygouwuchebookshanchu); view.setTag(viewHolder); } else { view=converView; viewHolder=(ViewHolder)view.getTag(); } final int pos = position;//定義一個final的int類型pos用來記錄點擊的位置 viewHolder.mygouwuchexuanze.setFocusable(false); viewHolder.mygouwuchebooknumjian.setFocusable(false); viewHolder.mygouwuchebooknumjia.setFocusable(false); viewHolder.mygouwuchebookshanchu.setFocusable(false); viewHolder.mygouwuchebooknumjian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(viewHolder.mygouwuchebooknum.getText().toString().equals("1")) { } else { viewHolder.mygouwuchebooknum.setText(String.valueOf(Integer.parseInt(viewHolder.mygouwuchebooknum.getText().toString())-1)); booknum[pos]=String.valueOf(Integer.parseInt(viewHolder.mygouwuchebooknum.getText().toString())); } } }); viewHolder.mygouwuchebooknumjia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewHolder.mygouwuchebooknum.setText(String.valueOf(Integer.parseInt(viewHolder.mygouwuchebooknum.getText().toString())+1)); booknum[pos]=String.valueOf(Integer.parseInt(viewHolder.mygouwuchebooknum.getText().toString())); } }); viewHolder.mygouwuchebookshanchu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,position+"查看",Toast.LENGTH_LONG).show(); } }); viewHolder.mygouwuchebookimage.setImageResource(mygouwuchebookclass.getImageviewId()); viewHolder.mygouwuchebookname.setText(mygouwuchebookclass.getBookname()); viewHolder.mugouwuchebookprice.setText(String.valueOf(mygouwuchebookclass.getPrice())); //pos必須聲明為final //下面是CheckBox的點擊事件, viewHolder.mygouwuchexuanze.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { checks[pos] = isChecked;//當被選中時,將該位置的CheckBox的狀態保存下來 }}); viewHolder.mygouwuchexuanze.setChecked(checks[pos]);//每次加載這個item時,將CheckBox的狀態賦值就OK了 viewHolder.mygouwuchebooknum.setText(booknum[pos]); return view; } public static boolean[] getChecks() { return checks; } public static void setChecks(boolean[] checks) { MygouwuchebookAdapter.checks = checks; } class ViewHolder { CheckBox mygouwuchexuanze; ImageView mygouwuchebookimage; TextView mygouwuchebookname; TextView mugouwuchebookprice; TextView mygouwuchebooknum; Button mygouwuchebooknumjian; Button mygouwuchebooknumjia; Button mygouwuchebookshanchu; CheckBox mygouwuchequanxuan; } }
主活動的代碼:
package com.example.book; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.text.Layout; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MygouwucheActivity extends AppCompatActivity { private List<Mygouwuchebookclass> mydianpubookclassList=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mygouwuche); inits();
MygouwuchebookAdapter
mygouwuchebookAdapter=new MygouwuchebookAdapter(MygouwucheActivity.this,R.layout.mygouwuchebook,mydianpubookclassList); ListView listView=(ListView)findViewById(R.id.mygouwuchelistview); listView.setAdapter(mygouwuchebookAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { Toast.makeText(MygouwucheActivity.this,position+"sss",Toast.LENGTH_LONG).show(); } }); } public void inits() { for (int i = 0; i < 3; i++) { Mygouwuchebookclass mygouwuchebookclass = new Mygouwuchebookclass(R.drawable.gonglue, "數據結構對對對點點滴滴", 3); mydianpubookclassList.add(mygouwuchebookclass); Mygouwuchebookclass mygouwuchebookclass1 = new Mygouwuchebookclass(R.drawable.fenlei, "數據結構對對對點點滴滴", 5); mydianpubookclassList.add(mygouwuchebookclass1); Mygouwuchebookclass mygouwuchebookclass2 = new Mygouwuchebookclass(R.drawable.fenlei, "數據結構對對對點點滴滴", 6); mydianpubookclassList.add(mygouwuchebookclass2); Mygouwuchebookclass mygouwuchebookclass3 = new Mygouwuchebookclass(R.drawable.shopping, "數據結構對對對點點滴滴", 2); mydianpubookclassList.add(mygouwuchebookclass3); Mygouwuchebookclass mygouwuchebookclass4 = new Mygouwuchebookclass(R.drawable.fenlei, "數據結構對對對點點滴滴", 8); mydianpubookclassList.add(mygouwuchebookclass4); Mygouwuchebookclass mygouwuchebookclass5 = new Mygouwuchebookclass(R.drawable.shopping, "數據結構對對對點點滴滴", 1); mydianpubookclassList.add(mygouwuchebookclass5); Mygouwuchebookclass mygouwuchebookclass6 = new Mygouwuchebookclass(R.drawable.gonglue, "數據結構對對對點點滴滴", 0); mydianpubookclassList.add(mygouwuchebookclass6); } } }
下面是解決方案:
package com.example.book; import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import org.w3c.dom.Text; import java.util.List; /** * Created by THINK on 2017/10/28. */ public class MygouwuchebookAdapter extends ArrayAdapter<Mygouwuchebookclass> { private int resourseId; private Context context; private static boolean[] checks;//定義數組來保存CheckBox的狀態,必須定義為static才能在主活動中調用 private String[] booknum;//同樣定義數組來保存Textview的狀態 private int length;//定義一個長度,來獲取listview 的長度 public MygouwuchebookAdapter(Context context, int textViewResourseId, List<Mygouwuchebookclass> objects) { super(context,textViewResourseId,objects); resourseId=textViewResourseId; this.context=context; checks = new boolean[objects.size()];//初始化數組 booknum=new String[objects.size()]; length=objects.size(); for(int i=0;i<objects.size();i++)//這里是我的text的初始化text,為1 { booknum[i]="1"; } } @Override public View getView(final int position, View converView, ViewGroup parent) { Mygouwuchebookclass mygouwuchebookclass=getItem(position); View view; final ViewHolder viewHolder; if(converView==null) { view = LayoutInflater.from(getContext()).inflate(resourseId, parent, false); viewHolder=new ViewHolder(); viewHolder.mygouwuchexuanze=(CheckBox) view.findViewById(R.id.Mygouwuchexuanze); viewHolder.mygouwuchebookimage=(ImageView)view.findViewById(R.id.mygouwuchebook); viewHolder.mygouwuchebookname=(TextView)view.findViewById(R.id.Mygouwuchebookname); viewHolder.mugouwuchebookprice=(TextView)view.findViewById(R.id.Mygouwuchebookprice); viewHolder.mygouwuchebooknum=(TextView)view.findViewById(R.id.Mygouwuchebooknum); viewHolder.mygouwuchebooknumjian=(Button)view.findViewById(R.id.Mygouwuchebooknumjian); viewHolder.mygouwuchebooknumjia=(Button)view.findViewById(R.id.Mygouwuchebooknumjia); viewHolder.mygouwuchebookshanchu=(Button)view.findViewById(R.id.Mygouwuchebookshanchu); view.setTag(viewHolder); } else { view=converView; viewHolder=(ViewHolder)view.getTag(); } final int pos = position;//定義一個final的int類型pos用來記錄點擊的位置 viewHolder.mygouwuchexuanze.setFocusable(false); viewHolder.mygouwuchebooknumjian.setFocusable(false); viewHolder.mygouwuchebooknumjia.setFocusable(false); viewHolder.mygouwuchebookshanchu.setFocusable(false); viewHolder.mygouwuchebooknumjian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(viewHolder.mygouwuchebooknum.getText().toString().equals("1")) { } else { viewHolder.mygouwuchebooknum.setText(String.valueOf(Integer.parseInt(viewHolder.mygouwuchebooknum.getText().toString())-1)); booknum[pos]=String.valueOf(Integer.parseInt(viewHolder.mygouwuchebooknum.getText().toString())); //text的text改變時,將text保存進數組里面 } } }); viewHolder.mygouwuchebooknumjia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewHolder.mygouwuchebooknum.setText(String.valueOf(Integer.parseInt(viewHolder.mygouwuchebooknum.getText().toString())+1)); booknum[pos]=String.valueOf(Integer.parseInt(viewHolder.mygouwuchebooknum.getText().toString())); //text的text改變時,將text保存進數組里面 } }); viewHolder.mygouwuchebookshanchu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,position+"查看",Toast.LENGTH_LONG).show(); } }); viewHolder.mygouwuchebookimage.setImageResource(mygouwuchebookclass.getImageviewId()); viewHolder.mygouwuchebookname.setText(mygouwuchebookclass.getBookname()); viewHolder.mugouwuchebookprice.setText(String.valueOf(mygouwuchebookclass.getPrice())); //pos必須聲明為final //下面是CheckBox的點擊事件, viewHolder.mygouwuchexuanze.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { checks[pos] = isChecked;//當被選中時,將該位置的CheckBox的狀態保存下來 }}); viewHolder.mygouwuchexuanze.setChecked(checks[pos]);//每次加載這個item時,將CheckBox的狀態賦值就OK了 viewHolder.mygouwuchebooknum.setText(booknum[pos]);//每次加載item時,給TextView的text賦值就OK了 return view; } public static boolean[] getChecks() { return checks; } public static void setChecks(boolean[] checks) { MygouwuchebookAdapter.checks = checks; } public void quanxuan(boolean ischecked) { for(int i=0;i<length;i++) { checks[i]=ischecked; } }//增加這個函數,如果主活動的選中全選時,將listview中每個CheckBox的狀態都改為選中就行 class ViewHolder { CheckBox mygouwuchexuanze; ImageView mygouwuchebookimage; TextView mygouwuchebookname; TextView mugouwuchebookprice; TextView mygouwuchebooknum; Button mygouwuchebooknumjian; Button mygouwuchebooknumjia; Button mygouwuchebookshanchu; CheckBox mygouwuchequanxuan; } }
主活動改變代碼:
package com.example.book; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.text.Layout; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MygouwucheActivity extends AppCompatActivity { private List<Mygouwuchebookclass> mydianpubookclassList=new ArrayList<>(); private MygouwuchebookAdapter mygouwuchebookAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mygouwuche); Toolbar toolbar=(Toolbar)findViewById(R.id.Mygouwuchetoolbar); toolbar.setTitle(""); toolbar.inflateMenu(R.menu.menu_mygouwuche); setSupportActionBar(toolbar); inits(); mygouwuchebookAdapter=new MygouwuchebookAdapter(MygouwucheActivity.this,R.layout.mygouwuchebook,mydianpubookclassList); ListView listView=(ListView)findViewById(R.id.mygouwuchelistview); listView.setAdapter(mygouwuchebookAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { Toast.makeText(MygouwucheActivity.this,position+"sss",Toast.LENGTH_LONG).show(); } }); CheckBox checkBoxquanxuan=(CheckBox)findViewById(R.id.mygouwuchecheckBox); checkBoxquanxuan.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { mygouwuchebookAdapter.quanxuan(isChecked);//當全選按鈕狀態改變時,改變listview中所以CheckBox的狀態,然后刷新listview適配器
mygouwuchebookAdapter.notifyDataSetChanged(); }}); } public void inits() { for (int i = 0; i < 3; i++) { Mygouwuchebookclass mygouwuchebookclass = new Mygouwuchebookclass(R.drawable.gonglue, "數據結構對對對點點滴滴", 3); mydianpubookclassList.add(mygouwuchebookclass); Mygouwuchebookclass mygouwuchebookclass1 = new Mygouwuchebookclass(R.drawable.fenlei, "數據結構對對對點點滴滴", 5); mydianpubookclassList.add(mygouwuchebookclass1); Mygouwuchebookclass mygouwuchebookclass2 = new Mygouwuchebookclass(R.drawable.fenlei, "數據結構對對對點點滴滴", 6); mydianpubookclassList.add(mygouwuchebookclass2); Mygouwuchebookclass mygouwuchebookclass3 = new Mygouwuchebookclass(R.drawable.shopping, "數據結構對對對點點滴滴", 2); mydianpubookclassList.add(mygouwuchebookclass3); Mygouwuchebookclass mygouwuchebookclass4 = new Mygouwuchebookclass(R.drawable.fenlei, "數據結構對對對點點滴滴", 8); mydianpubookclassList.add(mygouwuchebookclass4); Mygouwuchebookclass mygouwuchebookclass5 = new Mygouwuchebookclass(R.drawable.shopping, "數據結構對對對點點滴滴", 1); mydianpubookclassList.add(mygouwuchebookclass5); Mygouwuchebookclass mygouwuchebookclass6 = new Mygouwuchebookclass(R.drawable.gonglue, "數據結構對對對點點滴滴", 0); mydianpubookclassList.add(mygouwuchebookclass6); } } }
下面是截圖:
怎么樣是不是很簡單就實現了listview中CheckBox的全選狀態很簡單。