Android实战简易教程<五十一>(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)

来源:互联网 发布:windows开始菜单在哪 编辑:程序博客网 时间:2024/05/16 08:10

动态控制checkbox的显示和全选反选功能,我研究了一下,发现实现也比较容易,特写下此篇文章。学习就是要有发散思维,要举一反三,大家也可以根据我的实例进行改编,添加和删除一些功能,这样可以提高你对知识的认知!下面我们看一下代码:

1.main.xml:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.      >  
  7.   
  8.     <ListView  
  9.         android:id="@+id/drink_list"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="match_parent"  
  12.         android:layout_above="@+id/ll_btns"  
  13.        >  
  14.     </ListView>  
  15.   
  16.     <LinearLayout  
  17.         android:id="@+id/ll_btns"  
  18.         android:layout_width="match_parent"  
  19.         android:layout_height="58dp"  
  20.         android:layout_alignParentBottom="true"  
  21.         android:orientation="horizontal" >  
  22.   
  23.         <Button  
  24.             android:id="@+id/btn_commit"  
  25.             android:layout_width="wrap_content"  
  26.             android:layout_height="58dp"  
  27.             android:text="确定" />  
  28.   
  29.         <Button  
  30.             android:id="@+id/btn_select"  
  31.             android:layout_width="wrap_content"  
  32.             android:layout_height="58dp"  
  33.             android:text="点餐" />  
  34.          <Button  
  35.             android:id="@+id/btn_select_all"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="58dp"  
  38.             android:text="全选" />  
  39.           <Button  
  40.             android:id="@+id/btn_select_cancel"  
  41.             android:layout_width="wrap_content"  
  42.             android:layout_height="58dp"  
  43.             android:text="反选" />  
  44.     </LinearLayout>  
  45.   
  46. </RelativeLayout>  
2.item.xml:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="#ffffff"  
  6.     android:orientation="horizontal" >  
  7.   
  8.     <CheckBox  
  9.         android:id="@+id/check_box"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:clickable="false"  
  13.         android:focusable="false"  
  14.         android:focusableInTouchMode="true" />  
  15.   
  16.     <ImageView  
  17.         android:id="@+id/food_imager"  
  18.         android:layout_width="50dp"  
  19.         android:layout_height="50dp"  
  20.         android:background="#ffffff" />  
  21.   
  22.     <TextView  
  23.         android:id="@+id/food_name"  
  24.         android:layout_width="100dp"  
  25.         android:layout_height="50dp"  
  26.         android:text="咖啡"  
  27.         android:gravity="center_vertical"  
  28.         android:layout_marginLeft="10dp"  
  29.         android:textSize="18sp" />  
  30.   
  31.     <TextView  
  32.         android:layout_width="wrap_content"  
  33.         android:layout_height="50dp"  
  34.         android:text="单价:RMB  "  
  35.         android:paddingLeft="20dp"  
  36.         android:textSize="12sp" />  
  37.   
  38.     <TextView  
  39.         android:id="@+id/price"  
  40.         android:layout_width="wrap_content"  
  41.         android:layout_height="50dp"  
  42.         android:paddingRight="10dp"  
  43.         android:text="18"  
  44.         android:layout_marginLeft="20dp"  
  45.         android:textSize="18sp" />  
  46.   
  47. </LinearLayout>  
3.javabean:

[java] view plaincopy
  1. package com.example.info;  
  2.   
  3. public class Food {  
  4.   
  5.     public int food_img;  
  6.     public String food_name;  
  7.     public String food_price;  
  8.     public String text;  
  9.   
  10.     public int getFood_img() {  
  11.         return food_img;  
  12.     }  
  13.   
  14.     public void setFood_img(int food_img) {  
  15.         this.food_img = food_img;  
  16.     }  
  17.   
  18.     public String getFood_name() {  
  19.         return food_name;  
  20.     }  
  21.   
  22.     public void setFood_name(String food_name) {  
  23.         this.food_name = food_name;  
  24.     }  
  25.   
  26.     public String getFood_price() {  
  27.         return food_price;  
  28.     }  
  29.   
  30.     public void setFood_price(String food_price) {  
  31.         this.food_price = food_price;  
  32.     }  
  33.   
  34.     public Food(int food_img, String food_name, String food_price) {  
  35.         super();  
  36.         this.food_img = food_img;  
  37.         this.food_name = food_name;  
  38.         this.food_price = food_price;  
  39.     }  
  40.   
  41.     public Food() {  
  42.         super();  
  43.     }  
  44.   
  45.     @Override  
  46.     public String toString() {  
  47.         return super.toString();  
  48.     }  
  49. }  

4.MyListViewAdapter.java:

[java] view plaincopy
  1. package com.example.adapter;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5.   
  6. import com.example.info.Food;  
  7. import com.example.listviewselectitem.R;  
  8.   
  9. import android.content.Context;  
  10. import android.view.LayoutInflater;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.widget.BaseAdapter;  
  14. import android.widget.CheckBox;  
  15. import android.widget.ImageView;  
  16. import android.widget.TextView;  
  17.   
  18. public class MyListViewAdapter extends BaseAdapter {  
  19.     // 填充数据的list  
  20.     private ArrayList<Food> foodlist;  
  21.     // 用来控制CheckBox的选中状况  
  22.     private static HashMap<Integer, Boolean> isSelected;  
  23.     // 上下文  
  24.     private Context context;  
  25.     // 用来导入布局  
  26.     private LayoutInflater inflater = null;  
  27.       
  28.     private Boolean isShow=false;  
  29.   
  30.     // 构造器  
  31.     public MyListViewAdapter(ArrayList<Food> list, Context context,Boolean isShow) {  
  32.         this.context = context;  
  33.         this.foodlist = list;  
  34.         inflater = LayoutInflater.from(context);  
  35.         isSelected = new HashMap<Integer, Boolean>();  
  36.         this.isShow=isShow;  
  37.         // 初始化数据  
  38.         initDate();  
  39.     }  
  40.   
  41.     // 初始化isSelected的数据  
  42.     private void initDate() {  
  43.         for (int i = 0; i < foodlist.size(); i++) {  
  44.             getIsSelected().put(i, false);  
  45.         }  
  46.     }  
  47.   
  48.     @Override  
  49.     public int getCount() {  
  50.         return foodlist.size();  
  51.     }  
  52.   
  53.     @Override  
  54.     public Object getItem(int position) {  
  55.         return foodlist.get(position);  
  56.     }  
  57.   
  58.     @Override  
  59.     public long getItemId(int position) {  
  60.         return position;  
  61.     }  
  62.   
  63.     @Override  
  64.     public View getView(int position, View convertView, ViewGroup parent) {  
  65.         ViewHolder holder = null;  
  66.         if (convertView == null) {  
  67.             // 获得ViewHolder对象  
  68.             holder = new ViewHolder();  
  69.             // 导入布局并赋值给convertview  
  70.             convertView = inflater.inflate(R.layout.item, null);  
  71.             holder.imageView = (ImageView) convertView  
  72.                     .findViewById(R.id.food_imager);  
  73.             holder.txt1 = (TextView) convertView.findViewById(R.id.food_name);  
  74.             holder.txt2 = (TextView) convertView.findViewById(R.id.price);  
  75.             holder.cb = (CheckBox) convertView.findViewById(R.id.check_box);  
  76.             // 为view设置标签  
  77.             convertView.setTag(holder);  
  78.         } else {  
  79.             // 取出holder  
  80.             holder = (ViewHolder) convertView.getTag();  
  81.         }  
  82.         // 获取数据  
  83.         Food food = foodlist.get(position);  
  84.   
  85.         // 将数据填充到当前convertView的对应控件中  
  86.   
  87.         if(isShow){  
  88.             holder.cb.setVisibility(View.VISIBLE);  
  89.         }else {  
  90.             holder.cb.setVisibility(View.GONE);  
  91.         }  
  92.         holder.imageView.setImageResource(food.food_img);  
  93.         holder.txt1.setText(food.food_name);  
  94.         holder.txt2.setText(food.food_price);  
  95.         // 设置list中TextView的显示  
  96.         // 根据isSelected来设置checkbox的选中状况  
  97.         holder.cb.setChecked(getIsSelected().get(position));  
  98.         return convertView;  
  99.     }  
  100.   
  101.     public static HashMap<Integer, Boolean> getIsSelected() {  
  102.         return isSelected;  
  103.     }  
  104.   
  105.     public static void setIsSelected(HashMap<Integer, Boolean> isSelected) {  
  106.         MyListViewAdapter.isSelected = isSelected;  
  107.     }  
  108.   
  109.     public static class ViewHolder {  
  110.         public TextView txt1;  
  111.         public TextView txt2;  
  112.         public ImageView imageView;  
  113.         public CheckBox cb;  
  114.     }  
  115. }  

5.MainActivity.java:

[java] view plaincopy
  1. package com.example.listviewselectitem;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5.   
  6. import com.example.adapter.MyListViewAdapter;  
  7. import com.example.adapter.MyListViewAdapter.ViewHolder;  
  8. import com.example.info.Food;  
  9.   
  10. import android.app.Activity;  
  11. import android.os.Bundle;  
  12. import android.os.Handler;  
  13. import android.os.Message;  
  14. import android.view.LayoutInflater;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.view.Window;  
  18. import android.widget.AdapterView;  
  19. import android.widget.AdapterView.OnItemClickListener;  
  20. import android.widget.Button;  
  21. import android.widget.CheckBox;  
  22. import android.widget.ListView;  
  23. import android.widget.Toast;  
  24.   
  25. public class MainActivity extends Activity implements OnClickListener, OnItemClickListener {  
  26.   
  27.     private ListView listView;  
  28.     private Button ok, mSelectButton, mSelectAllButton, mCancelAllButton;  
  29.     private ArrayList<Food> foods = new ArrayList<Food>();  
  30.     private MyListViewAdapter adapter;  
  31.     private CheckBox checkBox;  
  32.     private int checkNum; // 记录选中的条目数量  
  33.   
  34.     private ArrayList<String> list;  
  35.     private Boolean isShow = false;  
  36.     private Handler handler = new Handler() {  
  37.         public void handleMessage(android.os.Message msg) {  
  38.             if (msg.what == 1) {  
  39.                 adapter = new MyListViewAdapter(foods, getApplicationContext(), true);  
  40.                 listView.setAdapter(adapter);  
  41.                 isShow = true;  
  42.                 mCancelAllButton.setVisibility(View.VISIBLE);  
  43.                 mSelectAllButton.setVisibility(View.VISIBLE);  
  44.             } else if (msg.what == 0) {  
  45.                 adapter = new MyListViewAdapter(foods, getApplicationContext(), false);  
  46.                 listView.setAdapter(adapter);  
  47.                 isShow = false;  
  48.                 mCancelAllButton.setVisibility(View.GONE);  
  49.                 mSelectAllButton.setVisibility(View.GONE);  
  50.             }  
  51.         };  
  52.     };  
  53.   
  54.     protected void onCreate(Bundle savedInstanceState) {  
  55.         super.onCreate(savedInstanceState);  
  56.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  57.         setContentView(R.layout.activity_main);  
  58.         initView();// 初始化控件  
  59.         View view = LayoutInflater.from(this).inflate(R.layout.item, null);  
  60.         checkBox = (CheckBox) view.findViewById(R.id.check_box);  
  61.   
  62.         initData();// 初始化虚拟数据  
  63.   
  64.         adapter = new MyListViewAdapter(foods, getApplicationContext(), false);  
  65.         isShow = false;  
  66.         listView.setAdapter(adapter);  
  67.     }  
  68.   
  69.     /** 
  70.      * 初始化控件 
  71.      */  
  72.     public void initView() {  
  73.         listView = (ListView) findViewById(R.id.drink_list);// listview列表控件  
  74.         ok = (Button) findViewById(R.id.btn_commit);// 确定按钮  
  75.   
  76.         list = new ArrayList<String>();  
  77.         mSelectButton = (Button) findViewById(R.id.btn_select);  
  78.         mSelectAllButton = (Button) findViewById(R.id.btn_select_all);  
  79.         mCancelAllButton = (Button) findViewById(R.id.btn_select_cancel);  
  80.         mSelectAllButton.setOnClickListener(this);  
  81.         mCancelAllButton.setOnClickListener(this);  
  82.   
  83.         if (isShow) {  
  84.             mSelectButton.setText("取消");  
  85.             mCancelAllButton.setVisibility(View.VISIBLE);  
  86.             mSelectAllButton.setVisibility(View.VISIBLE);  
  87.         } else {  
  88.             mSelectButton.setText("点餐");  
  89.             mCancelAllButton.setVisibility(View.GONE);  
  90.             mSelectAllButton.setVisibility(View.GONE);  
  91.         }  
  92.         mSelectButton.setOnClickListener(this);  
  93.         ok.setOnClickListener(this);  
  94.         listView.setOnItemClickListener(this);  
  95.     }  
  96.   
  97.     /** 
  98.      * 初始化虚拟数据 
  99.      */  
  100.     public void initData() {  
  101.   
  102.         Class cls = R.drawable.class;// 反射  
  103.         try {  
  104.             foods.add(new Food(cls.getDeclaredField("d1").getInt(null), "猕猴桃汁""10"));  
  105.             foods.add(new Food(cls.getDeclaredField("d2").getInt(null), "橙汁""12"));  
  106.             foods.add(new Food(cls.getDeclaredField("d3").getInt(null), "啤酒""15"));  
  107.             foods.add(new Food(cls.getDeclaredField("d4").getInt(null), "葡萄汁""10"));  
  108.             foods.add(new Food(cls.getDeclaredField("d5").getInt(null), "纯麦奶茶""8"));  
  109.             foods.add(new Food(cls.getDeclaredField("d6").getInt(null), "薄荷汁""10"));  
  110.             foods.add(new Food(cls.getDeclaredField("d7").getInt(null), "柠檬薄荷""12"));  
  111.             foods.add(new Food(cls.getDeclaredField("d8").getInt(null), "椰子汁""10"));  
  112.             foods.add(new Food(cls.getDeclaredField("d9").getInt(null), "珍珠奶茶""9"));  
  113.             foods.add(new Food(cls.getDeclaredField("d10").getInt(null), "石榴汁""10"));  
  114.   
  115.             for (int i = 0; i < foods.size(); i++) {  
  116.                 list.add("data" + " " + i);  
  117.             }  
  118.             ;  
  119.   
  120.         } catch (Exception e) {  
  121.             e.printStackTrace();  
  122.         }  
  123.     }  
  124.   
  125.     /** 
  126.      * 按钮的点击事件处理 
  127.      */  
  128.     @Override  
  129.     public void onClick(View v) {  
  130.         int mID = v.getId();  
  131.         switch (mID) {  
  132.         case R.id.btn_commit:  
  133.             myPrice();// 计算总价并输出  
  134.             break;  
  135.         case R.id.btn_select:  
  136.             if (isShow) {  
  137.                 Message message = Message.obtain();  
  138.                 message.what = 0;  
  139.                 handler.sendMessage(message);  
  140.                 mSelectButton.setText("点餐");  
  141.   
  142.             } else {  
  143.                 Message message = Message.obtain();  
  144.                 message.what = 1;  
  145.                 handler.sendMessage(message);  
  146.                 mSelectButton.setText("取消");  
  147.             }  
  148.             break;  
  149.         case R.id.btn_select_all:  
  150.             // 遍历list的长度,将MyAdapter中的map值全部设为true  
  151.             for (int i = 0; i < list.size(); i++) {  
  152.                 MyListViewAdapter.getIsSelected().put(i, true);  
  153.             }  
  154.             // 数量设为list的长度  
  155.             checkNum = list.size();  
  156.             // 刷新listview和TextView的显示  
  157.             adapter.notifyDataSetChanged();  
  158.             break;  
  159.         case R.id.btn_select_cancel:  
  160.             // 遍历list的长度,将MyAdapter中的map值全部设为true  
  161.             for (int i = 0; i < list.size(); i++) {  
  162.                 MyListViewAdapter.getIsSelected().put(i, false);  
  163.             }  
  164.             // 数量设为list的长度  
  165.             checkNum = list.size();  
  166.             // 刷新listview和TextView的显示  
  167.             adapter.notifyDataSetChanged();  
  168.             break;  
  169.   
  170.         }  
  171.     }  
  172.   
  173.     /** 
  174.      * 计算总价格的方法 
  175.      */  
  176.     public void myPrice() {  
  177.         HashMap<Integer, Boolean> map = MyListViewAdapter.getIsSelected();  
  178.         String str = "";  
  179.         int money = 0;  
  180.         for (int i = 0; i < map.size(); i++) {  
  181.             if (map.get(i)) {  
  182.                 str += (i + " ");  
  183.                 money += Integer.parseInt(foods.get(i).food_price);  
  184.             }  
  185.         }  
  186.         MyListViewAdapter.getIsSelected().get("");  
  187.         Toast.makeText(getApplicationContext(), "已选中了" + str + "项,总价钱为:" + money, Toast.LENGTH_SHORT).show();  
  188.     }  
  189.   
  190.     /** 
  191.      * listview的item的选择的方法 
  192.      */  
  193.     @Override  
  194.     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  195.         // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤  
  196.         ViewHolder holder = (ViewHolder) view.getTag();  
  197.         // 改变CheckBox的状态  
  198.         holder.cb.toggle();  
  199.         // 将CheckBox的选中状况记录下来  
  200.         MyListViewAdapter.getIsSelected().put(position, holder.cb.isChecked());  
  201.   
  202.     }  
  203. }  
动态控制checkbox显示的原理通过初始化Adapter传入参数,具体可以看代码,比较容易理解的。
看一下动态图效果:

样子较为丑陋,海涵

0 0
原创粉丝点击