MultiChoiceArrayAdapter其实就是可以多选的ArrayAdapter了,ArrayAdpter我们已经很熟悉了。MultiChoiceArrayAdapter这个类是抽象类,所以使用前必须要继承。下面是使用MultiChoiceArrayAdapter的步骤:

0.用自定义的控件来写一个layout

1.写一个类来继承MultiChoiceArrayAdapter

2.实例化这个类

3.用setAdapterView()来设置要加载适配器的控件。

4.写上保存的方法

  1. @Override
  2. protected void onSaveInstanceState(Bundle outState) {
  3. actionModeAdapter.save(outState);
  4. }

零、写布局文件

listview_actionmode_layout.xml

没什么特别的,就一个listview

  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:orientation="vertical" >
  6.  
  7. <ListView
  8. android:id="@+id/actionMode_listView"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content">
  11. </ListView>
  12.  
  13. </LinearLayout>

item.xml

注意这里要用自己定义的实现了Checkable接口的控件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <com.manuelpeinado.multichoiceadapter.view.CheckableLinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7.  
  8. android:background="@drawable/custom_list_item_background"
  9.  
  10. android:orientation="horizontal">
  11. <!-- 上面必须要用自定义的layout,否则不会有选中的效果!!! -->
  12.  
  13. <LinearLayout
  14. xmlns:android="http://schemas.android.com/apk/res/android"
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent"
  17. android:padding="16dp"
  18. android:orientation="horizontal" >
  19.  
  20. <TextView
  21. android:id="@+id/item_textView"
  22. android:layout_width="200dp"
  23. android:layout_height="wrap_content"
  24. android:layout_marginLeft="30dp"
  25. android:layout_gravity="center_vertical"
  26. android:textColor="#000000"
  27. android:layout_weight="1"
  28. android:textAppearance="?android:attr/textAppearanceLarge" />
  29.  
  30. </LinearLayout>
  31. </com.manuelpeinado.multichoiceadapter.view.CheckableLinearLayout>

二、继承MultiChoiceAdapter

这个是重点,每个方法中实现了不同的功能。其中discardSelectedItems()是自己写的,用来移除已经选中的items。

注意:onCreateActionMode()必须返回true,否则报错!

  1. private class TestAdapter extends MultiChoiceArrayAdapter<String>{
  2.  
  3. String tag = getClass().getSimpleName().toString();
  4.  
  5. /**
  6. * @param savedInstanceState
  7. * @param context
  8. * @param resource:Item的布局文件,即 R.layout.xxx
  9. * @param textViewResourceId:显示文字的textview的id,即R.id.xxxx
  10. * @param objects:一个String数组
  11. */
  12. public TestAdapter(Bundle savedInstanceState, Context context,
  13. int resource, int textViewResourceId, String[] objects) {
  14. //为了避免错误,这里将String数组转为ArrayList对象
  15. this(savedInstanceState,context,resource,textViewResourceId,
  16. new ArrayList<String>(Arrays.asList(objects)));
  17. }
  18.  
  19. /**
  20. * @param savedInstanceState
  21. * @param context
  22. * @param resource:Item的布局文件,即 R.layout.xxx
  23. * @param textViewResourceId:显示文字的textview的id,即R.id.xxxx
  24. * @param items:一个list<String>对象
  25. */
  26. public TestAdapter(Bundle savedInstanceState, Context context,
  27. int resource, int textViewResourceId, List<String> items) {
  28. super(savedInstanceState, context, resource, textViewResourceId, items);
  29. }
  30.  
  31. /**
  32. * 传入actionMode对象,进行设置图标和操作
  33. * 注意要返回true!
  34. */
  35. @Override
  36. public boolean onCreateActionMode(ActionMode mode, Menu menu) {
  37. Log.i(tag, "onCreateActionMode");
  38. MenuInflater inflater = mode.getMenuInflater();
  39. inflater.inflate(R.menu.my_action_mode, menu);
  40. //这里必须要写true,否则会报空指针!!!
  41. return true;
  42. }
  43. /**
  44. * 进行AndroidMode上图标操作的设置
  45. */
  46. @Override
  47. public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
  48. if (item.getItemId() == R.id.menu_share) {
  49. Toast.makeText(getContext(), "分享了" + getCheckedItemCount()+"个item", Toast.LENGTH_SHORT).show();
  50. return true;
  51. }
  52. if (item.getItemId() == R.id.menu_discard) {
  53. //丢弃选中的items
  54. discardSelectedItems();
  55. return true;
  56. }
  57. return false;
  58. }
  59.  
  60. @Override
  61. public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
  62. Log.i(tag, "onPrepareActionMode");
  63. return false;
  64. }
  65.  
  66. /**
  67. * (非必须)
  68. * 设置点击、选中效果,非必须。如果你在item的layout设置了 android:background那么下面就不用进行设置背景了
  69. * 个人推荐在item的layout中设置背景色,example:android:background="@drawable/custom_list_item_background"
  70. */
  71. /*@Override
  72. protected View getViewImpl(int position, View convertView, ViewGroup parent) {
  73. //Log.i(tag, "getViewImpl");
  74. View view = super.getViewImpl(position, convertView, parent);
  75. view.setBackgroundResource(R.drawable.custom_list_item_background);
  76. return view;
  77. }*/
  78.  
  79. /**
  80. * 从适配器中移除某些item
  81. */
  82. private void discardSelectedItems() {
  83. //得到选中的items
  84. Set<Long> selection = getCheckedItems();
  85. String[] items = new String[selection.size()];
  86. int i = 0;
  87. for (long position : selection) {
  88. items[i++] = getItem((int)position);
  89. }
  90.  
  91. //通过判断名字来remove掉这些items
  92. for (String item : items) {
  93. /**
  94. * 这里用remove时要注意传入适配器的不能是String[] items对象。否则会报错
  95. * 这里我已经在构造函数中进行了处理,传入String数组也不会出错了~
  96. */
  97. remove(item);
  98. }
  99.  
  100. finishActionMode();
  101. }
  102.  
  103. }

这里在继承的时候其实就顺带实现了ActionMode的callback接口的内容了,如果对ActionMode熟悉的人一定很容易理解。

二、实例化这个类

  1. TestAdapter actionModeAdapter;
  1.     String[] data = {"android","ios","wp","c++",
  2. "java","c#","javascript","vb",
  3. "delphi","PB","ASP","SQL"};
  4.  
  5. ListView actionModelistView = (ListView)findViewById(R.id.actionMode_listView);
  6.  
  7. actionModeAdapter = new TestAdapter(savedInstanceState, this,R.layout.item, R.id.item_textView, data);

三、设置控件和监听器

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.listview_actionmode_layout);
  5.  
  6. String[] data = {"android","ios","wp","c++",
  7. "java","c#","javascript","vb",
  8. "delphi","PB","ASP","SQL"};
  9.  
  10. ListView actionModelistView = (ListView)findViewById(R.id.actionMode_listView);
  11.  
  12. actionModeAdapter = new TestAdapter(savedInstanceState, this,R.layout.item, R.id.item_textView, data);
  13. actionModeAdapter.setAdapterView(actionModelistView);
  14. actionModeAdapter.setOnItemClickListener(new MyItemClick(actionModeAdapter));
  15.  
  16. //listView.setAdapter(adapter);//不这么用啦
  17.  
  18. }
  19.  
  20. /**
  21. * @author:Jack Tony
  22. * @tips :点击事件的监听器
  23. * @date :2014-10-20
  24. */
  25. private class MyItemClick implements OnItemClickListener{
  26.  
  27. private TestAdapter mAdapter;
  28.  
  29. public MyItemClick(TestAdapter adapter) {
  30. mAdapter = adapter;
  31. }
  32.  
  33. @Override
  34. public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
  35. Toast.makeText(getApplicationContext(), "点击了: " + mAdapter.getItem(position), Toast.LENGTH_SHORT).show();
  36. }
  37.  
  38. }

四、保存的方法

  1. @Override
  2. protected void onSaveInstanceState(Bundle outState) {
  3. actionModeAdapter.save(outState);
  4. }

于是大功告成!下面是全部代码:

ArrayAdapterTestActivity.java (这个类没用兼容模式,如果用兼容模式请参考顶部的注释,其实就是导入不同的包即可)

  1. package com.kale.multichoiceadaptertest;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. import java.util.Set;
  7.  
  8. import android.app.Activity;
  9. import android.content.Context;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.ActionMode;
  13. import android.view.Menu;
  14. import android.view.MenuInflater;
  15. import android.view.MenuItem;
  16. import android.view.View;
  17. import android.widget.AdapterView;
  18. import android.widget.AdapterView.OnItemClickListener;
  19. import android.widget.ListView;
  20. import android.widget.Toast;
  21.  
  22. import com.manuelpeinado.multichoiceadapter.normal.MultiChoiceArrayAdapter;
  23.  
  24. /**
  25. * 如果是4.0以上的版本可以直接用activity,不用actionbarActivity,导入的时候导入
  26. * import android.view.ActionMode;
  27. * import com.manuelpeinado.multichoiceadapter.normal.MultiChoiceArrayAdapter;
  28. * 把
  29. * import android.support.v7.view.ActionMode;
  30. * import com.manuelpeinado.multichoiceadapter.compat.MultiChoiceArrayAdapter;
  31. * 删掉
  32. */
  33.  
  34. /**
  35. * @author:Jack Tony
  36. * @tips :ActionMode和ArrayAdapter配合实现多选
  37. * @date :2014-10-21
  38. */
  39. public class ArrayAdapterTestActivity extends Activity{
  40.  
  41. TestAdapter actionModeAdapter;
  42.  
  43. @Override
  44. protected void onCreate(Bundle savedInstanceState) {
  45. super.onCreate(savedInstanceState);
  46. setContentView(R.layout.listview_actionmode_layout);
  47.  
  48. String[] data = {"android","ios","wp","c++",
  49. "java","c#","javascript","vb",
  50. "delphi","PB","ASP","SQL"};
  51.  
  52. ListView actionModelistView = (ListView)findViewById(R.id.actionMode_listView);
  53.  
  54. actionModeAdapter = new TestAdapter(savedInstanceState, this,R.layout.item, R.id.item_textView, data);
  55. actionModeAdapter.setAdapterView(actionModelistView);
  56. actionModeAdapter.setOnItemClickListener(new MyItemClick(actionModeAdapter));
  57.  
  58. //listView.setAdapter(adapter);//不这么用啦
  59.  
  60. }
  61.  
  62. @Override
  63. protected void onSaveInstanceState(Bundle outState) {
  64. actionModeAdapter.save(outState);
  65. }
  66.  
  67. private class TestAdapter extends MultiChoiceArrayAdapter<String>{
  68.  
  69. String tag = getClass().getSimpleName().toString();
  70.  
  71. /**
  72. * @param savedInstanceState
  73. * @param context
  74. * @param resource:Item的布局文件,即 R.layout.xxx
  75. * @param textViewResourceId:显示文字的textview的id,即R.id.xxxx
  76. * @param objects:一个String数组
  77. */
  78. public TestAdapter(Bundle savedInstanceState, Context context,
  79. int resource, int textViewResourceId, String[] objects) {
  80. //为了避免错误,这里将String数组转为ArrayList对象
  81. this(savedInstanceState,context,resource,textViewResourceId,
  82. new ArrayList<String>(Arrays.asList(objects)));
  83. }
  84.  
  85. /**
  86. * @param savedInstanceState
  87. * @param context
  88. * @param resource:Item的布局文件,即 R.layout.xxx
  89. * @param textViewResourceId:显示文字的textview的id,即R.id.xxxx
  90. * @param items:一个list<String>对象
  91. */
  92. public TestAdapter(Bundle savedInstanceState, Context context,
  93. int resource, int textViewResourceId, List<String> items) {
  94. super(savedInstanceState, context, resource, textViewResourceId, items);
  95. }
  96.  
  97. /**
  98. * 传入actionMode对象,进行设置图标和操作
  99. * 注意要返回true!
  100. */
  101. @Override
  102. public boolean onCreateActionMode(ActionMode mode, Menu menu) {
  103. Log.i(tag, "onCreateActionMode");
  104. MenuInflater inflater = mode.getMenuInflater();
  105. inflater.inflate(R.menu.my_action_mode, menu);
  106. //这里必须要写true,否则会报空指针!!!
  107. return true;
  108. }
  109.  
  110. /**
  111. * 进行AndroidMode上图标操作的设置
  112. */
  113. @Override
  114. public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
  115. if (item.getItemId() == R.id.menu_share) {
  116. Toast.makeText(getContext(), "分享了" + getCheckedItemCount()+"个item", Toast.LENGTH_SHORT).show();
  117. return true;
  118. }
  119. if (item.getItemId() == R.id.menu_discard) {
  120. //丢弃选中的items
  121. discardSelectedItems();
  122. return true;
  123. }
  124. return false;
  125. }
  126.  
  127. @Override
  128. public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
  129. Log.i(tag, "onPrepareActionMode");
  130. return false;
  131. }
  132.  
  133. /**
  134. * (非必须)
  135. * 设置点击、选中效果,非必须。如果你在item的layout设置了 android:background那么下面就不用进行设置背景了
  136. * 个人推荐在item的layout中设置背景色,example:android:background="@drawable/custom_list_item_background"
  137. */
  138. /*@Override
  139. protected View getViewImpl(int position, View convertView, ViewGroup parent) {
  140. //Log.i(tag, "getViewImpl");
  141. View view = super.getViewImpl(position, convertView, parent);
  142. view.setBackgroundResource(R.drawable.custom_list_item_background);
  143. return view;
  144. }*/
  145.  
  146. /**
  147. * 从适配器中移除某些item
  148. */
  149. private void discardSelectedItems() {
  150. //得到选中的items
  151. Set<Long> selection = getCheckedItems();
  152. String[] items = new String[selection.size()];
  153. int i = 0;
  154. for (long position : selection) {
  155. items[i++] = getItem((int)position);
  156. }
  157.  
  158. //通过判断名字来remove掉这些items
  159. for (String item : items) {
  160. /**
  161. * 这里用remove时要注意传入适配器的不能是String[] items对象。否则会报错
  162. * 这里我已经在构造函数中进行了处理,传入String数组也不会出错了~
  163. */
  164. remove(item);
  165. }
  166.  
  167. finishActionMode();
  168. }
  169.  
  170. }
  171.  
  172. /**
  173. * @author:Jack Tony
  174. * @tips :点击事件的监听器
  175. * @date :2014-10-20
  176. */
  177. private class MyItemClick implements OnItemClickListener{
  178.  
  179. private TestAdapter mAdapter;
  180.  
  181. public MyItemClick(TestAdapter adapter) {
  182. mAdapter = adapter;
  183. }
  184.  
  185. @Override
  186. public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
  187. Toast.makeText(getApplicationContext(), "点击了: " + mAdapter.getItem(position), Toast.LENGTH_SHORT).show();
  188. }
  189.  
  190. }
  191.  
  192. }

开源项目MultiChoiceAdapter详解(一)——概要介绍

开源项目MultiChoiceAdapter详解(二)——MultiChoiceArrayAdapter的使用

开源项目MultiChoiceAdapter详解(三)——MulitChoiceNormalArrayAdapter的使用

开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用

开源项目MultiChoiceAdapter详解(五)——可扩展的MultiChoiceBaseAdapter

开源项目MultiChoiceAdapter详解(六)——GridView和MultiChoiceBaseAdapter配合使用

开源项目MultiChoiceAdapter详解(二)——MultiChoiceArrayAdapter的使用的更多相关文章

  1. 开源项目MultiChoiceAdapter详解(六)——GridView和MultiChoiceBaseAdapter配合使用

    这篇其实没啥重要的,主要就算是个总结吧. 一.布局文件 这里实现的是类似于上图的多图选择的效果.关键在于item布局文件的写法.这也就是这个框架奇葩的一点,莫名其妙的要在一个自定义控件里面再放一个自定 ...

  2. 开源项目MultiChoiceAdapter详解(五)——可扩展的MultiChoiceBaseAdapter

    上次写到了开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用,其实我们仍旧可以不使用ActionMode的,所以这里就写一个自己扩展的方法. ...

  3. 开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用

    MultiChoiceBaseAdapter是一个可以多选的BaseAdapter,使用的方式相比来说扩展性更强! 使用方式: 1.布局文件 2.写一个类继承MultiChoiceBaseAdapte ...

  4. 开源项目MultiChoiceAdapter详解(三)——MulitChoiceNormalArrayAdapter的使用

    MulitChoiceNormalArrayAdapter是我自己定义的一个类,其实就是实现了MulitChoiceArrayAdapter,为什么做这个简单的实现类呢,因为这样我们在不用Action ...

  5. 开源项目MultiChoiceAdapter详解(一)——概要介绍

    项目地址:https://github.com/ManuelPeinado/MultiChoiceAdapter 这个项目主要是提供了一个多选适配器,使用者可以用它来替换传统的适配器,用途还算比较广泛 ...

  6. 开源项目PullToRefresh详解(二)——PullToRefreshGridView

    这里介绍的是PullToRefreshGridView的使用方法,和之前的PullToRefreshListView方法如出一辙,因为这个开源项目模块化很棒,所以很容易实现.等于说我们可以按照之前使用 ...

  7. 开源项目PullToRefresh详解(一)——PullToRefreshListView

       开源项地址:https://github.com/chrisbanes/Android-PullToRefresh 下拉刷新这个功能我们都比较常见了,今天介绍的就是这个功能的实现.我将按照这个开 ...

  8. 开源项目PullToRefresh详解(四)——PullToRefreshListView和ViewPager的结合使用

    其实这个不是什么新东西了,在介绍(一)中我们就知道了PullToRefreshListView的用法,这里只要将其放入到ViewPager中就行啦.ViewPager还是和以往一样的定义和使用,在适配 ...

  9. Android 开源项目DiskLruCache 详解

    有兴趣的同学可以读完这篇文章以后 可以看看这个硬盘缓存和volley 或者是其他 图片缓存框架中使用的硬盘缓存有什么异同点. 讲道理的话,其实硬盘缓存这个模块并不难写,难就难在 你要考虑到百分之0.1 ...

随机推荐

  1. CentOS 7安装图形化界面后重启出现Initial setup of CentOS Linux 7 (core)

    这是CentOS内核的初始设置页面,下面给出中文解释及操作方法. 1.CentOS Linux 7 初始设置(核心) 1)[!]许可证信息 (没有接受许可证) 请您选择[‘1’ 输入许可证信息 | ‘ ...

  2. 使用Sublime Text 3的HTML-CSS-JS Prettify插件格式化代码

    很多时候,我们想要格式化HTML-CSS-JS代码,网站上有很多实现此功能的小工具,当然,我的网站首页也有.但是,如果我们的代码编辑器上面也有这样的功能,那不是更加快速便捷?So,接下来,我们看看Su ...

  3. 最受欢迎编程语言又是谁?C语言居首,大数据赢了

    C语言占据榜首,但大数据类是最大赢家. IEEE Spectrum的第三次“最受欢迎编程语言”交互式排行榜新鲜出炉.因为不可能顾及到每一个程序员的想法,Spectrum使用多样化.可交互的的指标权重来 ...

  4. Cookie安全漫谈(转)

    add by zhj: 我也同意作者的观点,JavaScript 操作 Cookie 是一种不正常的做法:可以用 JavaScript 操作 Cookie 完成的功能,一样可以在服务端来完成. js操 ...

  5. 使用eclipse svn塔建(配置)时的一点点心得

    有没有人遇到下面这种情况??自己创建的SVN如下: 但网上别人搭建好的是这样子的: 就是为什么我的只有个主文件,而没有src.webroot.meta-inf.web-inf等子文件呢?? 这是我找了 ...

  6. 【Ray Tracing The Next Week 超详解】 光线追踪2-4 Perlin noise

     Preface 为了得到更好的纹理,很多人采用各种形式的柏林噪声(该命名来自于发明人 Ken Perlin) 柏林噪声是一种比较模糊的白噪声的东西:(引用书中一张图) 柏林噪声是用来生成一些看似杂乱 ...

  7. [Luogu5241]序列(DP)

    固定一种构造方法,使它能够构造出所有可能的序列. 对于一个要构造的序列,把所有点排成一串,若a[i]=a[i-1],那么从1所在弱连通块往连通块后一个点连,若所有点都在一个连通块里了,就在1所在强连通 ...

  8. hdu 4417 区间内比h小的数 划分树

    二分查找最近一个比h小的数 #include<cstdio> #include<iostream> #include<algorithm> #include< ...

  9. BZOJ4065 : [Cerc2012]Graphic Madness

    因为两棵树中间只有k条边,所以这些边一定要用到. 对于每棵树分别考虑: 如果一个点往下连着两个点,那么这个点往上的那条边一定不能用到. 如果一个点往下连着一个点,那么这个点往上的那条边一定不能用到. ...

  10. BZOJ4255 : Keep Fit!

    首先旋转坐标系,把每个点可以接收的范围转化成一个正方形. 然后建立k-d tree,并记录下每个点在k-d tree上的位置. 对询问使用莫队算法,修改$O(\log n)$,查询期望$O(\log ...