Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)

一般在外卖的选单中常常会用到ListView的多选,大家可以改进后加入自己的项目中。下面看一下代码:

一、代码

1.main.xml:(由一个ListView和一个Button组成)

[html]  view plain copy
  1. <span style="font-size:14px;">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:orientation="vertical" >  
  6.   
  7.     <ListView  
  8.         android:id="@+id/drink_list"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="0dp"  
  11.         android:layout_weight="1" >  
  12.     ListView>  
  13.   
  14.     <Button  
  15.         android:id="@+id/btn_commit"  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="58dp"  
  18.         android:text="确定" />  
  19.   
  20. LinearLayout>span>  
2.item.xml:

[html]  view plain copy
  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.Food.java:(bean类)

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

5.MainActivity.java:

[java]  view plain copy
  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.os.Bundle;  
  11. import android.app.Activity;  
  12. import android.content.Context;  
  13. import android.view.LayoutInflater;  
  14. import android.view.View;  
  15. import android.view.Window;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.AdapterView;  
  18. import android.widget.Button;  
  19. import android.widget.CheckBox;  
  20. import android.widget.ListView;  
  21. import android.widget.Toast;  
  22. import android.widget.AdapterView.OnItemClickListener;  
  23.   
  24. public class MainActivity extends Activity implements OnClickListener,  
  25.         OnItemClickListener {  
  26.   
  27.     private ListView listView;  
  28.     private Button ok;  
  29.     private ArrayList foods = new ArrayList();  
  30.     private MyListViewAdapter adapter;  
  31.     private CheckBox checkBox;  
  32.   
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  36.         setContentView(R.layout.activity_main);  
  37.         initView();// 初始化控件  
  38.         View view=LayoutInflater.from(this).inflate(R.layout.item, null);  
  39.         checkBox=(CheckBox)view.findViewById(R.id.check_box);  
  40.   
  41.         initData();// 初始化虚拟数据  
  42.   
  43.         adapter = new MyListViewAdapter(foods, getApplicationContext());  
  44.         listView.setAdapter(adapter);  
  45.     }  
  46.   
  47.     /** 
  48.      * 初始化控件 
  49.      * */  
  50.     public void initView() {  
  51.         listView = (ListView) findViewById(R.id.drink_list);// listview列表控件  
  52.         ok = (Button) findViewById(R.id.btn_commit);// 确定按钮  
  53.   
  54.         ok.setOnClickListener(this);  
  55.         listView.setOnItemClickListener(this);  
  56.     }  
  57.   
  58.     /** 
  59.      * 初始化虚拟数据 
  60.      * */  
  61.     public void initData() {  
  62.           
  63.           
  64.           
  65.           
  66.         Class cls = R.drawable.class;//反射  
  67.         try {  
  68.             foods.add(new Food(cls.getDeclaredField("d1").getInt(null), "猕猴桃汁",  
  69.                     "10"));  
  70.             foods.add(new Food(cls.getDeclaredField("d2").getInt(null), "橙汁",  
  71.                     "12"));  
  72.             foods.add(new Food(cls.getDeclaredField("d3").getInt(null), "啤酒",  
  73.                     "15"));  
  74.             foods.add(new Food(cls.getDeclaredField("d4").getInt(null), "葡萄汁",  
  75.                     "10"));  
  76.             foods.add(new Food(cls.getDeclaredField("d5").getInt(null), "纯麦奶茶",  
  77.                     "8"));  
  78.             foods.add(new Food(cls.getDeclaredField("d6").getInt(null), "薄荷汁",  
  79.                     "10"));  
  80.             foods.add(new Food(cls.getDeclaredField("d7").getInt(null), "柠檬薄荷",  
  81.                     "12"));  
  82.             foods.add(new Food(cls.getDeclaredField("d8").getInt(null), "椰子汁",  
  83.                     "10"));  
  84.             foods.add(new Food(cls.getDeclaredField("d9").getInt(null), "珍珠奶茶",  
  85.                     "9"));  
  86.             foods.add(new Food(cls.getDeclaredField("d10").getInt(null), "石榴汁",  
  87.                     "10"));  
  88.   
  89.         } catch (Exception e) {  
  90.             e.printStackTrace();  
  91.         }  
  92.     }  
  93.   
  94.     /** 
  95.      * 按钮的点击事件处理 
  96.      * */  
  97.     @Override  
  98.     public void onClick(View v) {  
  99.         int mID = v.getId();  
  100.         switch (mID) {  
  101.         case R.id.btn_commit:  
  102.             myPrice();// 计算总价并输出  
  103.             break;  
  104.           
  105.         }  
  106.     }  
  107.   
  108.     /** 
  109.      * 计算总价格的方法 
  110.      * */  
  111.     public void myPrice() {  
  112.         HashMap map = MyListViewAdapter.getIsSelected();  
  113.         String str = "";  
  114.         int money = 0;  
  115.         for (int i = 0; i < map.size(); i++) {  
  116.             if (map.get(i)) {  
  117.                 str += (i + " ");  
  118.                 money += Integer.parseInt(foods.get(i).food_price);  
  119.             }  
  120.         }  
  121.         MyListViewAdapter.getIsSelected().get("");  
  122.         Toast.makeText(getApplicationContext(),  
  123.                 "已选中了" + str + "项,总价钱为:" + money, Toast.LENGTH_SHORT).show();  
  124.     }  
  125.   
  126.     /** 
  127.      * listview的item的选择的方法 
  128.      * */  
  129.     @Override  
  130.     public void onItemClick(AdapterView parent, View view, int position,  
  131.             long id) {  
  132.         // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤  
  133.         ViewHolder holder = (ViewHolder) view.getTag();  
  134.         // 改变CheckBox的状态  
  135.         holder.cb.toggle();  
  136.         // 将CheckBox的选中状况记录下来  
  137.         MyListViewAdapter.getIsSelected().put(position, holder.cb.isChecked());  
  138.   
  139.     }  
  140. }  

二、运行实例

来源:http://blog.csdn.net/chenyanpeng2003

你可能感兴趣的:(Android实战简易教程-第四十七枪(ListView多选-实现点餐系统))