HoneyComb3.0技术系列之MultiChoice

原帖地址:http://blog.csdn.net/mayingcai1987/article/details/6232857


一. 概述:

 

     HoneyComb3.0中支持ListView和GridView的多选操作(长按后进入ActionMode模式),并且可以对选中的ListView或GridView的条目

 

    (Item)进行操作,比如:删除,修改等。

 

二. 效果图:

 

    1. ListView选择效果:

ListView选择

 

   3. GridView选择效果:

GridView选择

 

三. 代码实现:

 

     1. ListView多选,见效果图:

 

        (1)在res/menu/目标中创建菜单文件:

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  4.     <item android:id="@+id/share"  
  5.           android:title="share"  
  6.           android:icon="@android:drawable/ic_menu_share"  
  7.           android:showAsAction="always"   
  8.           />  
  9. </menu>  

 

        (2)主Activity实现:

[java]  view plain copy
  1. package com.focus.multichoice;  
  2.   
  3. import android.app.ListActivity;  
  4. import android.os.Bundle;  
  5. import android.view.ActionMode;  
  6. import android.view.Menu;  
  7. import android.view.MenuInflater;  
  8. import android.view.MenuItem;  
  9. import android.widget.ArrayAdapter;  
  10. import android.widget.ListView;  
  11. import android.widget.Toast;  
  12.   
  13. public class ListViewActivity extends ListActivity {  
  14.       
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.           
  18.         super.onCreate(savedInstanceState);  
  19.           
  20.         ListView mListView = getListView();  
  21.           
  22.         /** 
  23.          * 设置多选模式。 
  24.          */  
  25.         mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);  
  26.           
  27.         /** 
  28.          * 设置多选 模式监听器。 
  29.          */  
  30.         mListView.setMultiChoiceModeListener(new MultiChoiceModeCallback());  
  31.           
  32.         /** 
  33.          * 渲染ListView。 
  34.          */  
  35.         setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, mStrings));  
  36.           
  37.     }  
  38.       
  39.     /** 
  40.      * 在onStart()方法调用完成后会调用onPostCreate()方法,为ActionBar设置子标题,即:二级标题。 
  41.      */  
  42.     @Override  
  43.     protected void onPostCreate(Bundle savedInstanceState) {  
  44.         super.onPostCreate(savedInstanceState);  
  45.         getActionBar().setSubtitle("长按开始选择");  
  46.     }  
  47.   
  48.     private class MultiChoiceModeCallback implements ListView.MultiChoiceModeListener {  
  49.   
  50.         /** 
  51.          * 创建ActionMode,即:长按ListView以后会出现蒙板效果,这个蒙板就是ActionMode, 
  52.          * 可以在上面添加菜单,快捷按钮等。 
  53.          */  
  54.         public boolean onCreateActionMode(ActionMode mActionMode, Menu menu) {  
  55.             MenuInflater inflater = getMenuInflater();  
  56.               
  57.             /** 
  58.              * 设置ActionMode的菜单。 
  59.              */  
  60.             inflater.inflate(R.menu.list_select_menu, menu);  
  61.               
  62.             /** 
  63.              * 设置ActionMode的标题。 
  64.              */  
  65.             mActionMode.setTitle("Select Items");  
  66.               
  67.             setSubtitle(mActionMode);  
  68.               
  69.             return true;  
  70.         }  
  71.   
  72.         public boolean onPrepareActionMode(ActionMode mode, Menu menu) {  
  73.             return true;  
  74.         }  
  75.   
  76.         /** 
  77.          * 单击ActionMode的菜单项会调用此方法。 
  78.          */  
  79.         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {  
  80.             switch (item.getItemId()) {  
  81.                 case R.id.share:/* menu条目 */  
  82.                     Toast.makeText(ListViewActivity.this"Shared " + getListView().getCheckedItemCount() + " items", Toast.LENGTH_SHORT).show();  
  83.                     mode.finish();  
  84.                     break;  
  85.                 default:  
  86.                     Toast.makeText(ListViewActivity.this"Clicked " + item.getTitle(), Toast.LENGTH_SHORT).show();  
  87.                     break;  
  88.             }  
  89.             return true;  
  90.         }  
  91.   
  92.         public void onDestroyActionMode(ActionMode mode) {  
  93.               
  94.         }  
  95.   
  96.         /** 
  97.          * 在选择ListView的一个条目时会触发。 
  98.          */  
  99.         public void onItemCheckedStateChanged(ActionMode mActionMode, int position, long id, boolean checked) {  
  100.             setSubtitle(mActionMode);  
  101.         }  
  102.   
  103.         private void setSubtitle(ActionMode mode) {  
  104.             final int checkedCount = getListView().getCheckedItemCount();  
  105.               
  106.             switch (checkedCount) {  
  107.                 case 0:  
  108.                     mode.setSubtitle(null);  
  109.                     break;  
  110.                 case 1:  
  111.                     mode.setSubtitle("1 item selected");  
  112.                     break;  
  113.                 default:  
  114.                     mode.setSubtitle(checkedCount + " items selected");  
  115.                     break;  
  116.             }  
  117.         }  
  118.     }  
  119.   
  120.     private String [] mStrings = {"Abbaye de Belloc""Abbaye du Mont des Cats""Abertam"};  
  121.       
  122. }  

 

    2. GridView多选,见效果图:

 

        (1)res/layout/main.xml实现:

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <GridView   
  4.     xmlns:android = "http://schemas.android.com/apk/res/android"   
  5.     android:id = "@+id/mGridView"  
  6.     android:layout_width = "match_parent"   
  7.     android:layout_height = "match_parent"  
  8.     android:padding = "10dp"  
  9.     android:verticalSpacing = "10dp"  
  10.     android:horizontalSpacing = "10dp"  
  11.     android:numColumns = "auto_fit"  
  12.     android:columnWidth = "60dp"  
  13.     android:stretchMode = "columnWidth"  
  14.     android:gravity = "center"  
  15.     />  

 

        (2)主Activity实现:

[java]  view plain copy
  1. package com.focus.multichoice;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.content.pm.ResolveInfo;  
  9. import android.os.Bundle;  
  10. import android.view.ActionMode;  
  11. import android.view.Menu;  
  12. import android.view.MenuItem;  
  13. import android.view.View;  
  14. import android.view.ViewGroup;  
  15. import android.widget.BaseAdapter;  
  16. import android.widget.Checkable;  
  17. import android.widget.FrameLayout;  
  18. import android.widget.GridView;  
  19. import android.widget.ImageView;  
  20.   
  21. public class GridActivity extends Activity {  
  22.   
  23.     private GridView mGridView;  
  24.   
  25.     private List<ResolveInfo> mApps;  
  26.   
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.   
  31.         loadAllApps();  
  32.   
  33.         setContentView(R.layout.grid_layout);  
  34.           
  35.         mGridView = (GridView) findViewById(R.id.mGridView);  
  36.         mGridView.setAdapter(new AppsAdapter());  
  37.   
  38.         /** 
  39.          * 设置多选模式。 
  40.          */  
  41.         mGridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);  
  42.   
  43.         /** 
  44.          * 设置多选 模式监听器。 
  45.          */  
  46.         mGridView.setMultiChoiceModeListener(new MultiChoiceModeListener());  
  47.     }  
  48.   
  49.     /** 
  50.      * 通过PackageManager查找所有应用程序。 
  51.      */  
  52.     private void loadAllApps() {  
  53.         Intent mMainIntent = new Intent(Intent.ACTION_MAIN, null);  
  54.         mMainIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
  55.         mApps = getPackageManager().queryIntentActivities(mMainIntent, 0);  
  56.     }  
  57.   
  58.     /** 
  59.      *  
  60.      * 渲染GridView。 
  61.      *  
  62.      * @author mayingcai 
  63.      * 
  64.      */  
  65.     public class AppsAdapter extends BaseAdapter {  
  66.           
  67.         public View getView(int position, View convertView, ViewGroup parent) {  
  68.             CheckableLayout mCheckableLayout;  
  69.             ImageView mImageView;  
  70.   
  71.             if (convertView == null) {  
  72.                 mImageView = new ImageView(GridActivity.this);  
  73.                 mImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);  
  74.                 mImageView.setLayoutParams(new ViewGroup.LayoutParams(5050));  
  75.                 mCheckableLayout = new CheckableLayout(GridActivity.this);  
  76.                 mCheckableLayout.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT, GridView.LayoutParams.WRAP_CONTENT));  
  77.                 mCheckableLayout.addView(mImageView);  
  78.             } else {  
  79.                 mCheckableLayout = (CheckableLayout) convertView;  
  80.                 mImageView = (ImageView) mCheckableLayout.getChildAt(0);  
  81.             }  
  82.   
  83.             ResolveInfo info = mApps.get(position);  
  84.             mImageView.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));  
  85.   
  86.             return mCheckableLayout;  
  87.         }  
  88.   
  89.         public final int getCount() {  
  90.             return mApps.size();  
  91.         }  
  92.   
  93.         public final Object getItem(int position) {  
  94.             return mApps.get(position);  
  95.         }  
  96.   
  97.         public final long getItemId(int position) {  
  98.             return position;  
  99.         }  
  100.     }  
  101.   
  102.     public class CheckableLayout extends FrameLayout implements Checkable {  
  103.           
  104.         private boolean mChecked;  
  105.   
  106.         public CheckableLayout(Context context) {  
  107.             super(context);  
  108.         }  
  109.   
  110.         /** 
  111.          * 在被选择时设置蓝色背景。 
  112.          */  
  113.         public void setChecked(boolean checked) {  
  114.             mChecked = checked;  
  115.             setBackgroundDrawable(checked ? getResources().getDrawable(R.drawable.blue) : null);  
  116.         }  
  117.   
  118.         public boolean isChecked() {  
  119.             return mChecked;  
  120.         }  
  121.   
  122.         public void toggle() {  
  123.             setChecked( ! mChecked);  
  124.         }  
  125.     }  
  126.   
  127.     public class MultiChoiceModeListener implements GridView.MultiChoiceModeListener {  
  128.           
  129.         /** 
  130.          * 创建ActionMode蒙板。 
  131.          */  
  132.         public boolean onCreateActionMode(ActionMode mode, Menu menu) {  
  133.             mode.setTitle("Select Items");  
  134.             mode.setSubtitle("1 item selected");  
  135.             return true;  
  136.         }  
  137.   
  138.         public boolean onPrepareActionMode(ActionMode mode, Menu menu) {  
  139.             return true;  
  140.         }  
  141.   
  142.         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {  
  143.             return true;  
  144.         }  
  145.   
  146.         public void onDestroyActionMode(ActionMode mode) {  
  147.               
  148.         }  
  149.   
  150.         /** 
  151.          * 设置ActionMode标题。 
  152.          */  
  153.         public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {  
  154.             int selectCount = mGridView.getCheckedItemCount();  
  155.               
  156.             switch ( selectCount ) {  
  157.                 case 1 :  
  158.                     mode.setSubtitle("1 item selected");  
  159.                     break;  
  160.                 default :  
  161.                     mode.setSubtitle("" + selectCount + " items selected");  
  162.                     break;  
  163.             }  
  164.         }  
  165.   
  166.     }  
  167. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值