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. Java 日期时间获取和显示

    Java正确获取星期Calendar.DAY_OF_WEEKhttp://chamcon.iteye.com/blog/2144433 Java SimpleDateFormat 中英文时间格式化转换 ...

  2. Using NHibernate with SQLite

    The most convenient method to add NHibernate and SQLite for C# project is using NuGet. You can check ...

  3. NET 架构指南频道

    NET 架构指南频道 微软在Visual Studio 2017 正式发布的时候也上线了一个参考应用https://github.com/dotnet/eShopOnContainers , 最近微软 ...

  4. Chrome浏览器被hao123劫持,浏览器主页会被篡改为 hao123等

    先放一个知乎帖子: https://www.zhihu.com/question/21883209 我就只放几个有效解决办法了,具体的可以看上边那个帖子 方案一:     删掉桌面上的chrome图标 ...

  5. windows下解决PyCharm控制台中文输出乱码

    我用的PyCharm是2018.2版本 在调用os.system()的过程中遇到了控制台中文乱码的问题,具体如下 网上说的将两个Encoding格式都设置为UTF-8并没有解决问题,后来我将Proje ...

  6. html (第四本书第四章参考)

    上机1 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...

  7. Ubuntu 18.04 更新源

    [原因] 使用国外的源,在更新软件的时候会很慢,换成国内的源会快很多. [命令] 1.备份源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list ...

  8. code vs 2602 最短路径问题

    题目描述 Description 平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间.其中的一些点之间有连线.若有连线,则表示可从一个点到达另一个点,即两点间有通路,通 ...

  9. BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)

    题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...

  10. STL中优先队列的使用

    普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出的行为特征.我们来说一下C++的 ...