开源项目MultiChoiceAdapter详解(二)——MultiChoiceArrayAdapter的使用
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的使用的更多相关文章
- 开源项目MultiChoiceAdapter详解(六)——GridView和MultiChoiceBaseAdapter配合使用
这篇其实没啥重要的,主要就算是个总结吧. 一.布局文件 这里实现的是类似于上图的多图选择的效果.关键在于item布局文件的写法.这也就是这个框架奇葩的一点,莫名其妙的要在一个自定义控件里面再放一个自定 ...
- 开源项目MultiChoiceAdapter详解(五)——可扩展的MultiChoiceBaseAdapter
上次写到了开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用,其实我们仍旧可以不使用ActionMode的,所以这里就写一个自己扩展的方法. ...
- 开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用
MultiChoiceBaseAdapter是一个可以多选的BaseAdapter,使用的方式相比来说扩展性更强! 使用方式: 1.布局文件 2.写一个类继承MultiChoiceBaseAdapte ...
- 开源项目MultiChoiceAdapter详解(三)——MulitChoiceNormalArrayAdapter的使用
MulitChoiceNormalArrayAdapter是我自己定义的一个类,其实就是实现了MulitChoiceArrayAdapter,为什么做这个简单的实现类呢,因为这样我们在不用Action ...
- 开源项目MultiChoiceAdapter详解(一)——概要介绍
项目地址:https://github.com/ManuelPeinado/MultiChoiceAdapter 这个项目主要是提供了一个多选适配器,使用者可以用它来替换传统的适配器,用途还算比较广泛 ...
- 开源项目PullToRefresh详解(二)——PullToRefreshGridView
这里介绍的是PullToRefreshGridView的使用方法,和之前的PullToRefreshListView方法如出一辙,因为这个开源项目模块化很棒,所以很容易实现.等于说我们可以按照之前使用 ...
- 开源项目PullToRefresh详解(一)——PullToRefreshListView
开源项地址:https://github.com/chrisbanes/Android-PullToRefresh 下拉刷新这个功能我们都比较常见了,今天介绍的就是这个功能的实现.我将按照这个开 ...
- 开源项目PullToRefresh详解(四)——PullToRefreshListView和ViewPager的结合使用
其实这个不是什么新东西了,在介绍(一)中我们就知道了PullToRefreshListView的用法,这里只要将其放入到ViewPager中就行啦.ViewPager还是和以往一样的定义和使用,在适配 ...
- Android 开源项目DiskLruCache 详解
有兴趣的同学可以读完这篇文章以后 可以看看这个硬盘缓存和volley 或者是其他 图片缓存框架中使用的硬盘缓存有什么异同点. 讲道理的话,其实硬盘缓存这个模块并不难写,难就难在 你要考虑到百分之0.1 ...
随机推荐
- CentOS 7安装图形化界面后重启出现Initial setup of CentOS Linux 7 (core)
这是CentOS内核的初始设置页面,下面给出中文解释及操作方法. 1.CentOS Linux 7 初始设置(核心) 1)[!]许可证信息 (没有接受许可证) 请您选择[‘1’ 输入许可证信息 | ‘ ...
- 使用Sublime Text 3的HTML-CSS-JS Prettify插件格式化代码
很多时候,我们想要格式化HTML-CSS-JS代码,网站上有很多实现此功能的小工具,当然,我的网站首页也有.但是,如果我们的代码编辑器上面也有这样的功能,那不是更加快速便捷?So,接下来,我们看看Su ...
- 最受欢迎编程语言又是谁?C语言居首,大数据赢了
C语言占据榜首,但大数据类是最大赢家. IEEE Spectrum的第三次“最受欢迎编程语言”交互式排行榜新鲜出炉.因为不可能顾及到每一个程序员的想法,Spectrum使用多样化.可交互的的指标权重来 ...
- Cookie安全漫谈(转)
add by zhj: 我也同意作者的观点,JavaScript 操作 Cookie 是一种不正常的做法:可以用 JavaScript 操作 Cookie 完成的功能,一样可以在服务端来完成. js操 ...
- 使用eclipse svn塔建(配置)时的一点点心得
有没有人遇到下面这种情况??自己创建的SVN如下: 但网上别人搭建好的是这样子的: 就是为什么我的只有个主文件,而没有src.webroot.meta-inf.web-inf等子文件呢?? 这是我找了 ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-4 Perlin noise
Preface 为了得到更好的纹理,很多人采用各种形式的柏林噪声(该命名来自于发明人 Ken Perlin) 柏林噪声是一种比较模糊的白噪声的东西:(引用书中一张图) 柏林噪声是用来生成一些看似杂乱 ...
- [Luogu5241]序列(DP)
固定一种构造方法,使它能够构造出所有可能的序列. 对于一个要构造的序列,把所有点排成一串,若a[i]=a[i-1],那么从1所在弱连通块往连通块后一个点连,若所有点都在一个连通块里了,就在1所在强连通 ...
- hdu 4417 区间内比h小的数 划分树
二分查找最近一个比h小的数 #include<cstdio> #include<iostream> #include<algorithm> #include< ...
- BZOJ4065 : [Cerc2012]Graphic Madness
因为两棵树中间只有k条边,所以这些边一定要用到. 对于每棵树分别考虑: 如果一个点往下连着两个点,那么这个点往上的那条边一定不能用到. 如果一个点往下连着一个点,那么这个点往上的那条边一定不能用到. ...
- BZOJ4255 : Keep Fit!
首先旋转坐标系,把每个点可以接收的范围转化成一个正方形. 然后建立k-d tree,并记录下每个点在k-d tree上的位置. 对询问使用莫队算法,修改$O(\log n)$,查询期望$O(\log ...