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

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

1.写一个类来继承MultiChoiceArrayAdapter

2.实例化这个类

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

4.写上保存的方法

@Override
protected void onSaveInstanceState(Bundle outState) {
actionModeAdapter.save(outState);
}

零、写布局文件

listview_actionmode_layout.xml

没什么特别的,就一个listview

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ListView
android:id="@+id/actionMode_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView> </LinearLayout>

item.xml

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

<?xml version="1.0" encoding="utf-8"?>
<com.manuelpeinado.multichoiceadapter.view.CheckableLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" android:background="@drawable/custom_list_item_background" android:orientation="horizontal">
<!-- 上面必须要用自定义的layout,否则不会有选中的效果!!! --> <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:orientation="horizontal" > <TextView
android:id="@+id/item_textView"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_gravity="center_vertical"
android:textColor="#000000"
android:layout_weight="1"
android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout>
</com.manuelpeinado.multichoiceadapter.view.CheckableLinearLayout>

二、继承MultiChoiceAdapter

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

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

    private class TestAdapter extends MultiChoiceArrayAdapter<String>{

        String tag = getClass().getSimpleName().toString();

        /**
* @param savedInstanceState
* @param context
* @param resource:Item的布局文件,即 R.layout.xxx
* @param textViewResourceId:显示文字的textview的id,即R.id.xxxx
* @param objects:一个String数组
*/
public TestAdapter(Bundle savedInstanceState, Context context,
int resource, int textViewResourceId, String[] objects) {
//为了避免错误,这里将String数组转为ArrayList对象
this(savedInstanceState,context,resource,textViewResourceId,
new ArrayList<String>(Arrays.asList(objects)));
} /**
* @param savedInstanceState
* @param context
* @param resource:Item的布局文件,即 R.layout.xxx
* @param textViewResourceId:显示文字的textview的id,即R.id.xxxx
* @param items:一个list<String>对象
*/
public TestAdapter(Bundle savedInstanceState, Context context,
int resource, int textViewResourceId, List<String> items) {
super(savedInstanceState, context, resource, textViewResourceId, items);
} /**
* 传入actionMode对象,进行设置图标和操作
* 注意要返回true!
*/
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
Log.i(tag, "onCreateActionMode");
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.my_action_mode, menu);
//这里必须要写true,否则会报空指针!!!
return true;
}
/**
* 进行AndroidMode上图标操作的设置
*/
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == R.id.menu_share) {
Toast.makeText(getContext(), "分享了" + getCheckedItemCount()+"个item", Toast.LENGTH_SHORT).show();
return true;
}
if (item.getItemId() == R.id.menu_discard) {
//丢弃选中的items
discardSelectedItems();
return true;
}
return false;
} @Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
Log.i(tag, "onPrepareActionMode");
return false;
} /**
* (非必须)
* 设置点击、选中效果,非必须。如果你在item的layout设置了 android:background那么下面就不用进行设置背景了
* 个人推荐在item的layout中设置背景色,example:android:background="@drawable/custom_list_item_background"
*/
/*@Override
protected View getViewImpl(int position, View convertView, ViewGroup parent) {
//Log.i(tag, "getViewImpl");
View view = super.getViewImpl(position, convertView, parent);
view.setBackgroundResource(R.drawable.custom_list_item_background);
return view;
}*/ /**
* 从适配器中移除某些item
*/
private void discardSelectedItems() {
//得到选中的items
Set<Long> selection = getCheckedItems();
String[] items = new String[selection.size()];
int i = 0;
for (long position : selection) {
items[i++] = getItem((int)position);
} //通过判断名字来remove掉这些items
for (String item : items) {
/**
* 这里用remove时要注意传入适配器的不能是String[] items对象。否则会报错
* 这里我已经在构造函数中进行了处理,传入String数组也不会出错了~
*/
remove(item);
} finishActionMode();
} }

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

二、实例化这个类

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

三、设置控件和监听器

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_actionmode_layout); String[] data = {"android","ios","wp","c++",
"java","c#","javascript","vb",
"delphi","PB","ASP","SQL"}; ListView actionModelistView = (ListView)findViewById(R.id.actionMode_listView); actionModeAdapter = new TestAdapter(savedInstanceState, this,R.layout.item, R.id.item_textView, data);
actionModeAdapter.setAdapterView(actionModelistView);
actionModeAdapter.setOnItemClickListener(new MyItemClick(actionModeAdapter)); //listView.setAdapter(adapter);//不这么用啦 } /**
* @author:Jack Tony
* @tips :点击事件的监听器
* @date :2014-10-20
*/
private class MyItemClick implements OnItemClickListener{ private TestAdapter mAdapter; public MyItemClick(TestAdapter adapter) {
mAdapter = adapter;
} @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Toast.makeText(getApplicationContext(), "点击了: " + mAdapter.getItem(position), Toast.LENGTH_SHORT).show();
} }

四、保存的方法

    @Override
protected void onSaveInstanceState(Bundle outState) {
actionModeAdapter.save(outState);
}

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

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

package com.kale.multichoiceadaptertest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set; import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast; import com.manuelpeinado.multichoiceadapter.normal.MultiChoiceArrayAdapter; /**
* 如果是4.0以上的版本可以直接用activity,不用actionbarActivity,导入的时候导入
* import android.view.ActionMode;
* import com.manuelpeinado.multichoiceadapter.normal.MultiChoiceArrayAdapter;
* 把
* import android.support.v7.view.ActionMode;
* import com.manuelpeinado.multichoiceadapter.compat.MultiChoiceArrayAdapter;
* 删掉
*/ /**
* @author:Jack Tony
* @tips :ActionMode和ArrayAdapter配合实现多选
* @date :2014-10-21
*/
public class ArrayAdapterTestActivity extends Activity{ TestAdapter actionModeAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_actionmode_layout); String[] data = {"android","ios","wp","c++",
"java","c#","javascript","vb",
"delphi","PB","ASP","SQL"}; ListView actionModelistView = (ListView)findViewById(R.id.actionMode_listView); actionModeAdapter = new TestAdapter(savedInstanceState, this,R.layout.item, R.id.item_textView, data);
actionModeAdapter.setAdapterView(actionModelistView);
actionModeAdapter.setOnItemClickListener(new MyItemClick(actionModeAdapter)); //listView.setAdapter(adapter);//不这么用啦 } @Override
protected void onSaveInstanceState(Bundle outState) {
actionModeAdapter.save(outState);
} private class TestAdapter extends MultiChoiceArrayAdapter<String>{ String tag = getClass().getSimpleName().toString(); /**
* @param savedInstanceState
* @param context
* @param resource:Item的布局文件,即 R.layout.xxx
* @param textViewResourceId:显示文字的textview的id,即R.id.xxxx
* @param objects:一个String数组
*/
public TestAdapter(Bundle savedInstanceState, Context context,
int resource, int textViewResourceId, String[] objects) {
//为了避免错误,这里将String数组转为ArrayList对象
this(savedInstanceState,context,resource,textViewResourceId,
new ArrayList<String>(Arrays.asList(objects)));
} /**
* @param savedInstanceState
* @param context
* @param resource:Item的布局文件,即 R.layout.xxx
* @param textViewResourceId:显示文字的textview的id,即R.id.xxxx
* @param items:一个list<String>对象
*/
public TestAdapter(Bundle savedInstanceState, Context context,
int resource, int textViewResourceId, List<String> items) {
super(savedInstanceState, context, resource, textViewResourceId, items);
} /**
* 传入actionMode对象,进行设置图标和操作
* 注意要返回true!
*/
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
Log.i(tag, "onCreateActionMode");
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.my_action_mode, menu);
//这里必须要写true,否则会报空指针!!!
return true;
} /**
* 进行AndroidMode上图标操作的设置
*/
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == R.id.menu_share) {
Toast.makeText(getContext(), "分享了" + getCheckedItemCount()+"个item", Toast.LENGTH_SHORT).show();
return true;
}
if (item.getItemId() == R.id.menu_discard) {
//丢弃选中的items
discardSelectedItems();
return true;
}
return false;
} @Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
Log.i(tag, "onPrepareActionMode");
return false;
} /**
* (非必须)
* 设置点击、选中效果,非必须。如果你在item的layout设置了 android:background那么下面就不用进行设置背景了
* 个人推荐在item的layout中设置背景色,example:android:background="@drawable/custom_list_item_background"
*/
/*@Override
protected View getViewImpl(int position, View convertView, ViewGroup parent) {
//Log.i(tag, "getViewImpl");
View view = super.getViewImpl(position, convertView, parent);
view.setBackgroundResource(R.drawable.custom_list_item_background);
return view;
}*/ /**
* 从适配器中移除某些item
*/
private void discardSelectedItems() {
//得到选中的items
Set<Long> selection = getCheckedItems();
String[] items = new String[selection.size()];
int i = 0;
for (long position : selection) {
items[i++] = getItem((int)position);
} //通过判断名字来remove掉这些items
for (String item : items) {
/**
* 这里用remove时要注意传入适配器的不能是String[] items对象。否则会报错
* 这里我已经在构造函数中进行了处理,传入String数组也不会出错了~
*/
remove(item);
} finishActionMode();
} } /**
* @author:Jack Tony
* @tips :点击事件的监听器
* @date :2014-10-20
*/
private class MyItemClick implements OnItemClickListener{ private TestAdapter mAdapter; public MyItemClick(TestAdapter adapter) {
mAdapter = adapter;
} @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Toast.makeText(getApplicationContext(), "点击了: " + mAdapter.getItem(position), Toast.LENGTH_SHORT).show();
} } }

开源项目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. [转] React 最佳实践——那些 React 没告诉你但很重要的事

    前言:对很多 react 新手来说,网上能找到的资源大都是些简单的 tutorial ,它们能教会你如何使用 react ,但并不会告诉你怎么在实际项目中优雅的组织和编写 react 代码.用谷歌搜中 ...

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

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

  3. CSS------ul与div如何排成一行

    如图: 代码:(需要给div的float属性设置为left) <div style="margin-top:10px"> <div style="flo ...

  4. 通过css属性hack完成select样式美化,并兼容IE

    最近在重构时遇到了select样式问题,并且需要在不影响语义化的情况下,兼容IE8. 经过一番的百度后始终没有找到合适的纯CSS解决方案,最后换了一下思路,大胆使用了属性hack: 在chrome和F ...

  5. 多线程学习笔记四之Condition实现分析

    目录 简介 等待队列 nextWaiter 源码分析 await() signal() signalAll() 总结 简介   在使用内置锁synchronized时,通过调用java.lang.Ob ...

  6. 新手通过SVN向eclipse中导入项目注意事项

    该文章进行的前提是,jdk.eclipse.tomcat.maven已安装完成 要从svn上获取项目数据,首先要安装svn 1)通过help->installsoft->svn->a ...

  7. 数据转换bug花了半天时间 Java.math.BigDecimal cannot be cast to java.lang.String

    从数据库取出一个 Count函数 统计的值 在代码中要转成Integer类型的时候 Integer.parseInt((String)map.get("ID_")) 报了一下错误: ...

  8. gdb 调试及优化

    调试程序时,在gdb内p var,会提示 No symbol "var" in current context. 即使没有使用任何编译优化选项,仍然不能查看,可能是这些变量被优化到 ...

  9. npm 升级自身

    用cue-cli 生成新项目 提示升级npm 解决方案: npm install -g npm 呵呵呵,简直太简单了   然而今天是2016.11.11

  10. HTML5 的新特性以及新标签的浏览器兼容问题

    新特性: HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加. 1)  拖拽释放(Drag and drop) API 2)  语义化更好的内容标签(heade ...