MultiChoiceBaseAdapter是一个可以多选的BaseAdapter,使用的方式相比来说扩展性更强!

使用方式:

1.布局文件

2.写一个类继承MultiChoiceBaseAdapter

3.实现内部的各个方法

4.设置数据源和视图

5.完成保存的回调方法

一、布局文件

listview_actionmode_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/actionMode_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView> </LinearLayout>

item.xml

注意:这里值得注意的是添加了一个CheckBox,它的id很重要。如果是:@android:id/checkbox的话,用户点击这个checkbox的时候直接会进入可以多选的状态,如果是用其他的id的话,点击它就是普通的选择,不会触发多选状态。

<?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" /> <!--
CheckBox中一定要写上focusable="false"否则无法相应点击事件
@android:id/checkbox这个也一定要写,如果不写的话点击checkbox就不会触发多选状态
如果你不想要选中checkbox就触发多选状态的话,这里可以用自己定义的id就行
-->
<CheckBox
android:id="@android:id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
android:layout_weight="1"
android:layout_marginLeft="40dp"
android:textColor="#000000"
android:focusable="false"
android:visibility="gone"
android:text="" /> </LinearLayout>
</com.manuelpeinado.multichoiceadapter.view.CheckableLinearLayout>

二、继承MultiChoiceBaseAdapter

构造函数中推荐传入的是一个list对象,一个是因为可以方便的动态删除或者增加元素,还有一个是方便扩展。比如有一个对象Person传入一个List<Person>对象,然后用get(……)方法就可以进行相应的设置了。如果传入的是数组对象,就很难动态删除和增加了。

    private class MultiBaseAdapter extends MultiChoiceBaseAdapter{

        private List<String> mData;

        /**
* 构造函数
* @param savedInstanceState
*/
public MultiBaseAdapter(Bundle savedInstanceState,List<String> data) {
super(savedInstanceState);
// TODO 自动生成的构造函数存根
mData = data;
} /**
* 创建ActionMode对象,必须返回true!!!
*/
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.my_action_mode, menu);
return true;
} /**
* item点击时处理的事件,从ActionMode.callback中继承过来的
*/
@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) {
//TODO:删除选中的元素
removeSelectedItems();
return true;
}
return false;
} /**
* 删除已经选中的items
*/
private void removeSelectedItems() {
// http://stackoverflow.com/a/4950905/244576
List<Long> positions = new ArrayList<Long>(getCheckedItems());
Collections.sort(positions, Collections.reverseOrder());
for (long position : positions) {
mData.remove((int)position);
}
finishActionMode();
} @Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
// TODO 自动生成的方法存根
return false;
} /**
* 看适配器中有多少元素需要加载
*/
@Override
public int getCount() {
// TODO 自动生成的方法存根
return mData.size();
} /**
* 通过position来得到相应的item,这里返回object对象
*/
@Override
public Object getItem(int position) {
// TODO 自动生成的方法存根
return mData.get(position);
} /**
* 通过position得到id
*/
@Override
public long getItemId(int position) {
// TODO 自动生成的方法存根
return position;
} /**
* 返回item的view对象
*/
@Override
protected View getViewImpl(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
int layout = R.layout.item;
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(layout, parent, false);
}
ViewGroup group = (ViewGroup)convertView;
((TextView)group.findViewById(R.id.item_textView)).setText(mData.get(position));
((CheckBox)group.findViewById(android.R.id.checkbox)).setVisibility(View.VISIBLE);
return group;
} }

三、设置适配器和保存的方法

    private ArrayList<String> items ;

    private MultiBaseAdapter adapter;

    @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_actionmode_layout); String[] data = {"android","ios","wp","c++",
"java","c#","javascript","vb",
"delphi","PB","ASP","SQL"};
items = new ArrayList<String>(Arrays.asList(data)); ListView list = (ListView)findViewById(R.id.actionMode_listView);
adapter = new MultiBaseAdapter(savedInstanceState, items);
adapter.setAdapterView(list);
adapter.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
Toast.makeText(getApplicationContext(), "点击了"+items.get(position), 0).show();
}
}); } @Override
protected void onSaveInstanceState(Bundle outState) {
adapter.save(outState);
}

大功告成!!!

下面是全部代码:

BaseAdapterTestActivity.java

package com.kale.multichoiceadaptertest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; import com.manuelpeinado.multichoiceadapter.normal.MultiChoiceBaseAdapter; /**
* 4.0上的用activity
* 并且导入
* import android.view.ActionMode;
* import com.manuelpeinado.multichoiceadapter.normal.MultiChoiceBaseAdapter;
* 兼容2.0导入ActionbarActivity
* 并且导入
* import android.support.v7.view.ActionMode;
* import com.manuelpeinado.multichoiceadapter.compat.MultiChoiceBaseAdapter;
*/ /**
*
* @author:Jack Tony
* @tips :
* @date :2014-10-21
*/
public class BaseAdapterTestActivity extends Activity{ private ArrayList<String> items ; private MultiBaseAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_actionmode_layout); String[] data = {"android","ios","wp","c++",
"java","c#","javascript","vb",
"delphi","PB","ASP","SQL"};
items = new ArrayList<String>(Arrays.asList(data)); ListView list = (ListView)findViewById(R.id.actionMode_listView);
adapter = new MultiBaseAdapter(savedInstanceState, items);
adapter.setAdapterView(list);
adapter.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
Toast.makeText(getApplicationContext(), "点击了"+items.get(position), 0).show();
}
}); } @Override
protected void onSaveInstanceState(Bundle outState) {
adapter.save(outState);
} private class MultiBaseAdapter extends MultiChoiceBaseAdapter{ private List<String> mData; /**
* 构造函数
* @param savedInstanceState
*/
public MultiBaseAdapter(Bundle savedInstanceState,List<String> data) {
super(savedInstanceState);
// TODO 自动生成的构造函数存根
mData = data;
} /**
* 创建ActionMode对象,必须返回true!!!
*/
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.my_action_mode, menu);
return true;
} /**
* item点击时处理的事件,从ActionMode.callback中继承过来的
*/
@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) {
//TODO:删除选中的元素
removeSelectedItems();
return true;
}
return false;
} /**
* 删除已经选中的items
*/
private void removeSelectedItems() {
// http://stackoverflow.com/a/4950905/244576
List<Long> positions = new ArrayList<Long>(getCheckedItems());
Collections.sort(positions, Collections.reverseOrder());
for (long position : positions) {
mData.remove((int)position);
}
finishActionMode();
} @Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
// TODO 自动生成的方法存根
return false;
} /**
* 看适配器中有多少元素需要加载
*/
@Override
public int getCount() {
// TODO 自动生成的方法存根
return mData.size();
} /**
* 通过position来得到相应的item,这里返回object对象
*/
@Override
public Object getItem(int position) {
// TODO 自动生成的方法存根
return mData.get(position);
} /**
* 通过position得到id
*/
@Override
public long getItemId(int position) {
// TODO 自动生成的方法存根
return position;
} /**
* 返回item的view对象
*/
@Override
protected View getViewImpl(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
int layout = R.layout.item;
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(layout, parent, false);
}
ViewGroup group = (ViewGroup)convertView;
((TextView)group.findViewById(R.id.item_textView)).setText(mData.get(position));
((CheckBox)group.findViewById(android.R.id.checkbox)).setVisibility(View.VISIBLE);
return group;
} } }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Android 开源项目DiskLruCache 详解

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

随机推荐

  1. Codeforces Round #440 (Div. 1, based on Technocup 2018 Elimination Round 2) C - Points, Lines and Ready-made Titles

    C - Points, Lines and Ready-made Titles 把行列看成是图上的点, 一个点(x, y)就相当于x行 向 y列建立一条边, 我们能得出如果一个联通块是一棵树方案数是2 ...

  2. P1417 烹调方案 背包DP

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  3. PHP函数之trigger_error

    在程序开发中,如果我们编码不规范,比如调用不存在的变量.语法错误.少了个逗号,这些都会引起系统报错并进行提示,但是今天,突然发现PHP还有这样一个函数,用于自动触发一个报错提示,并且会将报错信息写入p ...

  4. linux timer operate

    1.gettimeofday()    ---->   http://www.linuxidc.com/Linux/2012-06/61903.htm   (一般)

  5. Harbor 企业级镜像仓库搭建

    Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角 ...

  6. MIT-6.824 Lab 3: Fault-tolerant Key/Value Service

    概述 lab2中实现了raft协议,本lab将在raft之上实现一个可容错的k/v存储服务,第一部分是实现一个不带日志压缩的版本,第二部分是实现日志压缩.时间原因我只完成了第一部分. 设计思路 如上图 ...

  7. React Hooks新特性学习随笔

    React Hooks 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 前言 本篇主要以讲几个常用的api为主. 1.u ...

  8. mac那些事儿

    OS是苹果公司开发的电脑操作系统,MAC是苹果公司开发的笔记本.台式机.IOS是苹果公司开发的移动操作系统,iPhone是苹果公司研发的智能手机系列,搭载IOS操作系统. 一.mac系统快捷键 回到桌 ...

  9. Redis五大类型操作使用以及订阅发布功能

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  10. FireDAC 下的 Sqlite [4] - 创建数据库

    建立数据库的代码: {建立内存数据库的一般代码:} begin FDConnection1.DriverName := 'SQLite'; //同 FDConnection1.Params.Add(' ...