MulitChoiceNormalArrayAdapter是我自己定义的一个类,其实就是实现了MulitChoiceArrayAdapter,为什么做这个简单的实现类呢,因为这样我们在不用ActionMode的时候就不用每次要写一个类来继承MulitChoiceArrayAdapter了,直接实例化MulitChoiceNormalArrayAdapter即可。下面贴一个compat包下的MulitChoiceNormalArrayAdapter的源码。

MulitChoiceNormalArrayAdapter.java

package com.manuelpeinado.multichoiceadapter.compat;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import android.content.Context;
import android.os.Bundle;
import android.support.v7.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem; public class MulitChoiceNormalArrayAdapter<T> extends MultiChoiceArrayAdapter<T> { public MulitChoiceNormalArrayAdapter(Bundle savedInstanceState,
Context context, int resource, int textViewResourceId) {
super(savedInstanceState, context, resource, textViewResourceId);
// TODO 自动生成的构造函数存根
} public MulitChoiceNormalArrayAdapter(Bundle savedInstanceState,
Context context, int resource, int textViewResourceId,
List<T> objects) {
super(savedInstanceState, context, resource, textViewResourceId, objects);
// TODO 自动生成的构造函数存根
} public MulitChoiceNormalArrayAdapter(Bundle savedInstanceState,
Context context, int resource, int textViewResourceId, T[] objects) {
this(savedInstanceState,context,resource,textViewResourceId,new ArrayList<T>(Arrays.asList(objects)));
// TODO 自动生成的构造函数存根
} @Override
public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) {
// TODO 自动生成的方法存根
return false;
} @Override
public boolean onCreateActionMode(ActionMode arg0, Menu arg1) {
// TODO 自动生成的方法存根
return false;
} @Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
// TODO 自动生成的方法存根
return false;
} }

好了,知道了这个后我们来看怎么简单的来使用这个适配器进行多选。

1.写布局文件

2.实例化MultiChoiceAdapter

3.设置showActionMode(false)来表示不使用ActionMode

4.setAdapterView();来设置要用适配器的view对象

5.设置下监听器来进行各种扩展的操作

一、布局文件

listview_normal_layout.xml

<?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/normal_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
</ListView> <LinearLayout
android:id="@+id/setting_linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"> <Button
android:id="@+id/selectAll_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全选"
android:layout_weight="1"
android:onClick="buttonListener"/> <Button
android:id="@+id/cancle_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"
android:layout_weight="1"
android:onClick="buttonListener"/> <Button
android:id="@+id/delete_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="删除"
android:onClick="buttonListener"/> <Button
android:id="@+id/share_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分享"
android:layout_weight="1"
android:onClick="buttonListener"/> </LinearLayout> </LinearLayout>

item.xml

<?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>

二、实现适配器和绑定适配器

        final LinearLayout settingLL = (LinearLayout)findViewById(R.id.setting_linearLayout);
settingLL.setVisibility(View.GONE); ListView normalListView = (ListView)findViewById(R.id.normal_listView); String[] data = {"android","ios","wp","c++",
"java","c#","javascript","vb",
"delphi","PB","ASP","SQL"}; //ArrayList<String> items = new ArrayList<>(Arrays.asList(data)); normalAdapter = new MulitChoiceNormalArrayAdapter<String>(savedInstanceState,
getApplicationContext(), R.layout.item, R.id.item_textView, data); normalAdapter.showActionMode(false);//设置为显示actionmode的普通模式
normalAdapter.setAdapterView(normalListView);
normalAdapter.setOnItemClickListener(new MyItemClick(normalAdapter));

三、写一些回调方法来优化,比如选中时点击返回后取消选中

    @Override
protected void onSaveInstanceState(Bundle outState) {
normalAdapter.save(outState);
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK ) {
if (normalAdapter.getCheckedItemCount() > 0) {
cancleAll(normalAdapter);
return true;
}
}
return super.onKeyDown(keyCode, event);
}

四、绑定监听器

setOnItemClickListener是在item被点击时触发的

setOnSelectedStateChangeListener是item被选中或者取消选中时触发的

        normalAdapter.setOnItemClickListener(new MyItemClick(normalAdapter));
normalAdapter.setOnSelectedStateChangeListener(new OnSelectedStateChangeListener() { /**
* checkedItemCount = 已经选中的item数目
*/
@Override
public void onSelectedStateChanged(int checkedItemCount) {
if (checkedItemCount != 0) {
settingLL.setVisibility(View.VISIBLE);
}
else {
settingLL.setVisibility(View.GONE);
}
}
}); /**
* @author:Jack Tony
* @tips :点击事件的监听器
* @date :2014-10-20
*/
private class MyItemClick implements OnItemClickListener{ private MultiChoiceArrayAdapter<String> mAdapter; public MyItemClick(MultiChoiceArrayAdapter<String> 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();
} }

五、通过按钮进行操作(这是扩展性的重要体现)

    public void buttonListener(View v) {
switch (v.getId()) {
case R.id.selectAll_button:
selectAll(normalAdapter);
break;
case R.id.cancle_button:
cancleAll(normalAdapter);
break;
case R.id.delete_button:
delectItems(normalAdapter);
break;
case R.id.share_button:
Toast.makeText(getApplicationContext(), "分享"+Arrays.toString(getSelectedItems(normalAdapter)), 1).show();
cancleAll(normalAdapter);
break;
default:
break;
}
} /**
* 全选
* @param adapter
*/
private void selectAll(MultiChoiceArrayAdapter<String> adapter) {
for (int i = 0; i < adapter.getCount(); ++i) {
adapter.setItemChecked(i, true);
}
} /**
* 取消所有选择效果
* @param adapter
*/
private void cancleAll(MultiChoiceArrayAdapter<String> adapter) {
for (int i = 0; i < adapter.getCount(); ++i) {
adapter.setItemChecked(i, false);
}
} /**
* 得到已经选中的items
* @param adapter
* @return
*/
private String[] getSelectedItems(MultiChoiceArrayAdapter<String> adapter) {
//得到选中的items
Set<Long> selection = adapter.getCheckedItems();
String[] items = new String[selection.size()];
int i = 0;
for (long position : selection) {
items[i++] = adapter.getItem((int)position);
}
return items;
} /**
* 删除已经选中的items
* @param adapter
*/
private void delectItems(MultiChoiceArrayAdapter<String> adapter) {
//通过判断名字来remove掉这些items
for (String item : getSelectedItems(adapter)) {
/**
* 这里用remove时要注意传入适配器的不能是String[] items对象。否则会报错
* 这里我已经在构造函数中进行了处理,传入String数组也不会出错了~
*/
adapter.remove(item);
}
cancleAll(adapter);
}

全部搞定了!!!

下面是全部代码:

package com.kale.multichoiceadaptertest;

import java.util.Arrays;
import java.util.Set; import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast; import com.manuelpeinado.multichoiceadapter.base.OnSelectedStateChangeListener;
import com.manuelpeinado.multichoiceadapter.compat.MulitChoiceNormalArrayAdapter;
import com.manuelpeinado.multichoiceadapter.compat.MultiChoiceArrayAdapter; /**
* 如果不用到ActionMode对象的话可以放心大胆的继承activity,也不用导入ActionMode了。
*
* 其实在不用ActionMode时导入
* import com.manuelpeinado.multichoiceadapter.normal.MulitChoiceNormalArrayAdapter;
* import com.manuelpeinado.multichoiceadapter.normal.MultiChoiceArrayAdapter;
* 或者是
* import com.manuelpeinado.multichoiceadapter.compat.MulitChoiceNormalArrayAdapter;
* import com.manuelpeinado.multichoiceadapter.compat.MultiChoiceArrayAdapter;
* 都一样的,只是为了以后的扩展,还是按需导入吧。
* 4.0以上的导入normal包下面的,兼容2.0的导入compat包下的
*/ public class ArrayAdapterNormalTestActivity extends Activity{ MulitChoiceNormalArrayAdapter<String> normalAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_normal_layout); final LinearLayout settingLL = (LinearLayout)findViewById(R.id.setting_linearLayout);
settingLL.setVisibility(View.GONE); ListView normalListView = (ListView)findViewById(R.id.normal_listView); String[] data = {"android","ios","wp","c++",
"java","c#","javascript","vb",
"delphi","PB","ASP","SQL"}; //ArrayList<String> items = new ArrayList<>(Arrays.asList(data)); normalAdapter = new MulitChoiceNormalArrayAdapter<String>(savedInstanceState,
getApplicationContext(), R.layout.item, R.id.item_textView, data); normalAdapter.showActionMode(false);//设置为显示actionmode的普通模式
normalAdapter.setAdapterView(normalListView);
normalAdapter.setOnItemClickListener(new MyItemClick(normalAdapter));
normalAdapter.setOnSelectedStateChangeListener(new OnSelectedStateChangeListener() { /**
* checkedItemCount = 已经选中的item数目
*/
@Override
public void onSelectedStateChanged(int checkedItemCount) {
if (checkedItemCount != 0) {
settingLL.setVisibility(View.VISIBLE);
}
else {
settingLL.setVisibility(View.GONE);
}
}
});
} @Override
protected void onSaveInstanceState(Bundle outState) {
normalAdapter.save(outState);
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK ) {
if (normalAdapter.getCheckedItemCount() > 0) {
cancleAll(normalAdapter);
return true;
}
}
return super.onKeyDown(keyCode, event);
} public void buttonListener(View v) {
switch (v.getId()) {
case R.id.selectAll_button:
selectAll(normalAdapter);
break;
case R.id.cancle_button:
cancleAll(normalAdapter);
break;
case R.id.delete_button:
delectItems(normalAdapter);
break;
case R.id.share_button:
Toast.makeText(getApplicationContext(), "分享"+Arrays.toString(getSelectedItems(normalAdapter)), 1).show();
cancleAll(normalAdapter);
break;
default:
break;
}
} /**
* 全选
* @param adapter
*/
private void selectAll(MultiChoiceArrayAdapter<String> adapter) {
for (int i = 0; i < adapter.getCount(); ++i) {
adapter.setItemChecked(i, true);
}
} /**
* 取消所有选择效果
* @param adapter
*/
private void cancleAll(MultiChoiceArrayAdapter<String> adapter) {
for (int i = 0; i < adapter.getCount(); ++i) {
adapter.setItemChecked(i, false);
}
} /**
* 得到已经选中的items
* @param adapter
* @return
*/
private String[] getSelectedItems(MultiChoiceArrayAdapter<String> adapter) {
//得到选中的items
Set<Long> selection = adapter.getCheckedItems();
String[] items = new String[selection.size()];
int i = 0;
for (long position : selection) {
items[i++] = adapter.getItem((int)position);
}
return items;
} /**
* 删除已经选中的items
* @param adapter
*/
private void delectItems(MultiChoiceArrayAdapter<String> adapter) {
//通过判断名字来remove掉这些items
for (String item : getSelectedItems(adapter)) {
/**
* 这里用remove时要注意传入适配器的不能是String[] items对象。否则会报错
* 这里我已经在构造函数中进行了处理,传入String数组也不会出错了~
*/
adapter.remove(item);
}
cancleAll(adapter);
} /**
* @author:Jack Tony
* @tips :点击事件的监听器
* @date :2014-10-20
*/
private class MyItemClick implements OnItemClickListener{ private MultiChoiceArrayAdapter<String> mAdapter; public MyItemClick(MultiChoiceArrayAdapter<String> 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详解(三)——MulitChoiceNormalArrayAdapter的使用的更多相关文章

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

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

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

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

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

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

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

    MultiChoiceArrayAdapter其实就是可以多选的ArrayAdapter了,ArrayAdpter我们已经很熟悉了.MultiChoiceArrayAdapter这个类是抽象类,所以使 ...

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

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

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

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

  7. 开源项目PullToRefresh详解(三)——PullToRefreshScrollView

    和前几篇文章一样,这里还是先设置布局文件,然后找到这个控件.只不过这里要简单很多. 1.布局文件 <?xml version="1.0" encoding="utf ...

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

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

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

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

随机推荐

  1. IntelliJ IDEA快捷键:Esc

    the Esc key in any tool window moves the focus to the editor. 任何工具窗口都会将焦点移动到编辑器.

  2. WebAPI性能优化

    WebAPI性能优化之压缩解压 有时候为了提升WebAPI的性能,减少响应时间,我们会使用压缩和解压,而现在大多数客户端浏览器都提供了内置的解压支持.在WebAPI请求的资源越大时,使用压缩对性能提升 ...

  3. Python3.7.2,在Linux上跑来跑去的,是在升级打怪么?

    Python3.7.2,在Linux上跑来跑去的,是在升级打怪么?   前不久,发布了Python在Windows(程序员:Python学不学?完全没必要纠结)和Mac OS(我是Python,P派第 ...

  4. Java 发送http post 请求

    package com.sm.utils; import java.io.BufferedReader; import java.io.InputStreamReader; import java.i ...

  5. React Native之原生模块的开发(Android)学习笔记

      目录 1.为什么我们需要原生模块开发 2.开发Android原生模块的主要流程 3.原生模块开发实战   1.为什么我们需要原生模块开发? 我们在用RN开发App的时候,有时候需要用到一些原生模块 ...

  6. BZOJ.1013.[JSOI2008]球形空间产生器(高斯消元)

    题目链接 HDU3571 //824kb 40ms //HDU3571弱化版 跟那个一比这个太水了,练模板吧. //列出$n+1$个二次方程后两两相减,就都是一次方程了. #include <c ...

  7. Beta冲刺准备

    过去存在的问题: 界面不够美观 推荐不够人性化 代码不够符合开闭原则 我们已经做了哪些调整/改进: 本来想引入springAndroid,但看了下google的官方文档,不建议引入第三方框架:代码重构 ...

  8. poj 1797 最短路变形dijkstra

    题意:题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量 链接:点我 解题思路:其实这个求最大边可以近似于 ...

  9. 20172308《Java软件结构与数据结构》第四周学习总结

    教材学习内容总结 第 6 章 列表 一. 列表集合 列表集合:一种概念性表示法,思想是使事物以线性列表的方式进行组织 特点: 列表集合没有内在的容量大小,它可以随着需要而增大 列表集合更具一般化,可以 ...

  10. Centos7 安装 ActiveMQ 5.15.1

    环境 [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node1 ~]# uname -r -.el ...