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. Intellij Idea启用Git可视化界面

    第一步. 第二步. 然后点击OK 验证 

  2. chunk writer 中需要对抛错的交易进行回滚,同时又要在其他表中记录是哪一笔交易记录失败

    首先根据我有限的知识判断,回滚之后进行写表,该写表动作只能使用listener来进行. 考虑使用的listener有:ItemWriteListener     StepExecutionListen ...

  3. javascript研究小组知识库

    http://hzjavaeyer.group.iteye.com/group/wiki?category_id=0

  4. 【LOJ】#2264. 「CTSC2017」吉夫特

    题解 根据一番认真严肃的猜结论和打表证明之后 我们可以得到 \(f[i] = (\sum_{a[i] \& a[j] == a[j]} f[j]) + 1\) 统计所有的\(f[i] - 1\ ...

  5. Codeforces Round #355 (Div. 2) D. Vanya and Treasure

    题目大意: 给你一个n × m 的图,有p种宝箱, 每个点上有一个种类为a[ i ][ j ]的宝箱,a[ i ][ j ] 的宝箱里有 a[ i ][ j ] + 1的钥匙,第一种宝箱是没有锁的, ...

  6. ThinkPHP V5.0 正式版发布

    ThinkPHP5.0版本是一个颠覆和重构版本,官方团队历时十月,倾注了大量的时间和精力,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持compose ...

  7. django 不能访问静态资源的解决办法

    最近在中文win10下使用python的django搭建web测试服务器,发现一个诡异的现象,正常配置好django的模型,视图和模板, 1.setting.py内容如下: ""& ...

  8. DSP 程序的执行时间

    在访问TSCL寄存器前要定义 cregister volatile unsigned int TSCL; TSCL/TSCH,它们与CPU同频,共同表示一个64-bit数,CPU运行一个cycle,该 ...

  9. vue-video-player的使用总结

    由于公司的项目是网上教育的,像网易云课堂那种教育网站,因而会有很多课程需要在线观看的,所以视频插件是必不可少的. 由于我用vue开发项目,所以找视频插件也找和vue贴近的.最后选择了vue-video ...

  10. BZOJ.3932.[CQOI2015]任务查询系统(主席树 差分)

    题目链接 对于这一区间的操作,我们可以想到差分+前缀和(感觉也没什么别的了..). 同时对于本题我们能想到主席树,而主席树正是利用前一个节点建树的. 所以离散化.按时间排序,把操作拆成单点加和减即可. ...