GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本系统解决方案

Android ListView CHOICE_MODE_MULTIPLE_MODAL多选模式解析 Android ListView CHOICE_MODE_MULTIPLE_MODAL多选模式解析 最近的课程需要做一个通讯录App,于是就想借鉴Android自带的Contacts应用,实现里面的一些效果。在删除联系人时,Contacts的界面是这样的。 一开始觉得这个功能很复杂,后来在网上找了一下,发现这个功能是Android自带的,只要在xml布局文件中将ListView的mode属... 阅读详情

项目开发中需要使用GridView批处理操作,多项选择。

但是GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本。


找解决方案,查看android sdk提供的demo里介绍的GridView多项选择的方法

public class Grid3 extends Activity {

    GridView mGrid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        loadApps();

        setContentView(R.layout.grid_1);
        mGrid = (GridView) findViewById(R.id.myGrid);
        mGrid.setAdapter(new AppsAdapter());
        mGrid.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
        mGrid.setMultiChoiceModeListener(new MultiChoiceModeListener());
    }

    private List<ResolveInfo> mApps;

    private void loadApps() {
        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
    }

    public class AppsAdapter extends BaseAdapter {
        public AppsAdapter() {
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            CheckableLayout l;
            ImageView i;

            if (convertView == null) {
                i = new ImageView(Grid3.this);
                i.setScaleType(ImageView.ScaleType.FIT_CENTER);
                i.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
                l = new CheckableLayout(Grid3.this);
                l.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT,
                        GridView.LayoutParams.WRAP_CONTENT));
                l.addView(i);
            } else {
                l = (CheckableLayout) convertView;
                i = (ImageView) l.getChildAt(0);
            }

            ResolveInfo info = mApps.get(position);
            i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));

            return l;
        }


        public final int getCount() {
            return mApps.size();
        }

        public final Object getItem(int position) {
            return mApps.get(position);
        }

        public final long getItemId(int position) {
            return position;
        }
    }

    public class CheckableLayout extends FrameLayout implements Checkable {
        private boolean mChecked;

        public CheckableLayout(Context context) {
            super(context);
        }

        public void setChecked(boolean checked) {
            mChecked = checked;
            setBackgroundDrawable(checked ?
                    getResources().getDrawable(R.drawable.blue)
                    : null);
        }

        public boolean isChecked() {
            return mChecked;
        }

        public void toggle() {
            setChecked(!mChecked);
        }

    }

    public class MultiChoiceModeListener implements GridView.MultiChoiceModeListener {
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.setTitle("Select Items");
            mode.setSubtitle("One item selected");
            return true;
        }

        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return true;
        }

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return true;
        }

        public void onDestroyActionMode(ActionMode mode) {
        }

        public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
                boolean checked) {
            int selectCount = mGrid.getCheckedItemCount();
            switch (selectCount) {
            case 1:
                mode.setSubtitle("One item selected");
                break;
            default:
                mode.setSubtitle("" + selectCount + " items selected");
                break;
            }
        }

    }
}

实现了implements Checkable,然后可以设置GridView的多项选择,但是无法兼容低版本

后来自己琢磨发现了解决兼容低版本的方法,见代码

给GridView设置的Adapter

List<CodeGoodsListEntiy> goods = new ArrayList<CodeGoodsListEntiy>();
	public class CollectionAdapter extends BaseAdapter{

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return goods.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		public void addDataList(List<CodeGoodsListEntiy> goodsList){
			goods.addAll(goodsList);
		}
		
		public void removeAllList(){
			goods.removeAll(goods);
		}
		
		public void removeData(CodeGoodsListEntiy entity){
			goods.remove(entity);
		}
		
		public List<CodeGoodsListEntiy> getList(){
			return goods;
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			CheckableLayout layout = null;
			CodeGoodsListEntiy good = goods.get(position);
			if(convertView==null){
				layout = new CheckableLayout();
				convertView = inflater.inflate(R.layout.mycollection_griditem, null);
				layout.imgviewlayout = (RelativeLayout) convertView.findViewById(R.id.imgviewlayout);
				layout.iv = (ImageView) convertView.findViewById(R.id.iv);
				layout.price = (TextView) convertView
						.findViewById(R.id.price);
				layout.title = (TextView) convertView.findViewById(R.id.title);
				layout.sellnums = (TextView) convertView.findViewById(R.id.sells);
				layout.item_selectbtn = (ImageView) convertView.findViewById(R.id.item_selectbtn);
				layout.item_topview = (ImageView) convertView.findViewById(R.id.item_topview);
				convertView.setTag(layout);
			}else{
				layout =  (CheckableLayout) convertView.getTag();
			}
			
			layout.price.setText("¥"+good.getSalePrice());
			layout.title.setText(good.getTitle());
			layout.sellnums.setText("月销量"+good.getSellNums());
			layout.imgviewlayout.getLayoutParams().height = (SettingUtil.getDisplaywidthPixels() - SettingUtil
					.dip2px(8)) / 2;
			layout.iv.getLayoutParams().height = (SettingUtil.getDisplaywidthPixels() - SettingUtil
					.dip2px(10)) / 2;
			App.imageLoader.displayImage(good.getMainImg(), layout.iv, options, new SimpleImageLoadingListener());
			if(editModel){
				if(selecteditem.contains(position)){
					layout.setChecked(true);
				}else{
					layout.setChecked(false);
				}
			}else{
				layout.item_selectbtn.setVisibility(View.GONE);
				layout.item_topview.setVisibility(View.GONE);
			}
			return convertView;
		}
		
	}
	
	class CheckableLayout implements Checkable{

		View convertView;
		ImageView item_selectbtn;
		ImageView item_topview;
		ImageView iv;
		TextView price;
		TextView title;
		TextView sellnums;
		RelativeLayout imgviewlayout;
		
		private boolean mChecked = false;
		
		public CheckableLayout() {
			// TODO Auto-generated constructor stub
		}
		

		@Override
		public void setChecked(boolean checked) {
			// TODO Auto-generated method stub
			mChecked = checked;
			if(item_topview!=null){
				if(mChecked){
					item_topview.setVisibility(View.GONE);
				}else{
					item_topview.setVisibility(View.VISIBLE);
				}
			}
			if(item_selectbtn!=null){
				if(mChecked){
					item_selectbtn.setVisibility(View.VISIBLE);
				}else{
					item_selectbtn.setVisibility(View.GONE);
				}
			}
		}

		@Override
		public boolean isChecked() {
			// TODO Auto-generated method stub
			return mChecked;
		}

		@Override
		public void toggle() {
			// TODO Auto-generated method stub
			setChecked(!mChecked);
		}

	}

其实这里class CheckableLayout implements Checkable类似于一般的Adapter里的ViewHolder的类一样的。

然后给GridView设置的ItemClickListener的方法

private OnItemClickListener onlvItemClick = new OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			if(editModel){
				CheckableLayout holder = (CheckableLayout) arg1.getTag();
				if(selecteditem.contains(arg2)){
					selecteditem.remove((Integer)arg2);
					holder.setChecked(false);
				}else{
					selecteditem.add(arg2);
					holder.setChecked(true);
				}
			}else{
				ProDetailActivity.launch(MyCollectionActivity.this, goods
						.get(arg2).getItemId());
			}
		}
	};

其实这里很关键的就是通过传来的View得到那个ViewHolder类

CheckableLayout holder = (CheckableLayout) arg1.getTag();

或者用下面的代码

View view = gv.getChildAt(arg2 - gv.getFirstVisiblePosition());
CheckableLayout holder = (CheckableLayout) view.getTag();

这里一般的GridView或者ListView的BaseAdapter里复用了convertView的话,GridView.getChildCount的数量少于BaseAdapter.getCount数量。只会显示屏幕显示出的数量,这是BaseAdapter用ViewHolder复用convertView的特点。

所以如果要获取到单个itemview的话用上面的方法。

讲到这里吧,很多项目代码涉及到商业性,有问题可以交流。这种方法需要注意细节就是了。

Android-AbsListView-Drag-And-Drop:具有拖放功能的复杂 ListView 和 GridView Android-AbsListView-Drag-And-Drop 具有拖放功能的复杂 ListView 和 GridView。 拖拽项目到下拉菜单视图,回调下拉功能。 滑动选择 怎么看? 拖放和MultiChoice(官方和自定义) 滑动选择,例如 Google 相册 用法 多选 选择模式 选择模式.官方 它是AbsListView.setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) ,您还需要setMultiChoiceModeListener() 。 listView . setSelectionMode( SelectionMode . Official ); listView . setMultiChoiceModeListener(multiChoiceModeListener); 选择模式.自定义 这是一个自定义的多选模式,你应该 立即下载

相关推荐

YOLOv10注意力革新:小波域注意力(WDA)如何实现多尺度特征精准聚焦

本文深入解析YOLOv10中的小波域注意力(WDA)机制,探讨其如何通过频域分解与动态聚焦实现多尺度特征精准提取。WDA模块结合离散小波变换与注意力机制,显著提升小目标检测性能,在VisDrone数据集上AP提升达12.6%。文章详细介绍了两种集成方案及代码实现,为计算机视觉开发者提供实用指南。

weixin_29079671的博客 253

GridView实现多选,全选,反选等功能

先看看效果 我这里用到了数据库来储存选择的数据,数据库的简单实用我在前面的博客写过了,这里就不多说了,直接贴代码数据库操作类的代码package com.duanlian.gridviewmultiplechoicedemo.database;import android.content.ContentValues; import android.content.Context; import a

段炼 7951

【AI生成】市面上主流自组网厂家的技术及市场研究

经过对全球自组网产业技术特征与市场格局的系统分析,本文得出以下核心结论:技术演进呈现智能化与融合化双轨路径 当前自组网技术创新已突破传统组网架构局限,形成"协议优化-架构创新-场景适配"的递进式发展路径。国际厂商聚焦智能算法应用,如Silvus采用深度学习实现动态拓扑优化,传输时延较传统方案降低37%;国内企业则侧重异构网络融合,中国移动设计院提出的5G LAN架构使工业场景通信可靠性提升至99.99%。

qq_31310977的博客 1698

android GridView实现图库预览图,多选模式下右上角打勾

看到有初学者有这样的需求: GridView实现图库预览图,多选模式下右上角打勾。(4.0图库的预览图多选时,多了个蓝色边框,其实是蓝色背景)        GridView在自己实际开发中也没用到过,就想试着实现下,写个demo供初学者参考,高手略过。        先来个效果图吧:        实现起来不复杂,就2个文件。 首先看看GridView继承关系:

4376

手把手教你用Node.js模拟大麦APP下单请求(含滑块验证处理)

本文详细解析了如何使用Node.js模拟大麦APP下单请求的全流程,包括接口逆向、滑块验证处理和签名算法逆向等关键技术。通过实战案例和代码示例,帮助开发者掌握移动端API调用的核心要素,如动态参数构造、安全验证突破等,提升自动化下单的成功率和效率。

weixin_42569329的博客 355

rk3588主板PDM接口接数字MIC录音

本文介绍了Rockchip 3588平台上6麦克风PDM接口的硬件连接与软件调试过程。硬件方面展示了PDM0_CLK0_M0时钟脚和三组数据脚的连接方案。软件配置包括设备树修改,生成声卡节点,并提供了6通道录音命令示例。文章重点分析了两个常见问题:录音无声(需检查供电、接线和波形)和通道数据缺失(需正确配置rockchip,path-map寄存器映射)。最后通过Audition工具验证录音文件,确认各通道工作正常。调试过程完整展现了从硬件连接到软件配置的完整流程。

m0_60805802的博客 1015

ListView多选操作模式详解CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL

这篇文章我们将详细的介绍如何实现ListView的多选操作,文中将会纠正在使用ListViewCHOICE_MODE_MULTIPLE或者CHOICE_MODE_MULTIPLE_MODAL时容易犯的错误,以及 CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL的区别。最后我们将给出一个demo来演示两种多选操作的实现。 一、在不使用Li

jianghejie123的专栏 4717

YOLOv8高级应用实战:多目标跟踪+实例分割+小样本检测(工业/安防场景落地指南)

安防监控中,需要跟踪多个行人的运动轨迹,而不只是框出“这是行人”;工业质检时,要精确分割出零件的缺陷区域(像素级),而不是只给一个粗略的矩形框;罕见场景下(如特殊故障检测、稀有动物识别),只能收集到几十张样本,普通训练方法精度惨不忍睹。我在落地工业安防和质检项目时,把YOLOv8的高级功能摸了个遍,踩过“多目标跟踪遮挡丢帧”“实例分割边缘模糊”“小样本检测过拟合”等一系列坑,最终总结出这套可直接复用的实战方案。多目标跟踪(ByteTrack)、实例分割、小样本检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 750

RecyclerView的多选模式

在ListView中实现多选并不困难,因为它是自带多选模式的,主要包括CHOICE_MODE_MULTIPLE和CHOICE_MODE_MULTIPLE_MODAL。如果你想要更深入的了解这两者是如何工作的。那么这篇文章是非常适合你的。他们之间的区别大概就是CHOICE_MODE_MULTIPLE模式的特点在于他本身没有排斥性,在能选择item的情况下,也可以响应普通点击事件。CHOICE_MODE

jxq1994的博客 2050

【机器学习-17】数据变换---小波变换特征提取及应用案列介绍

小波变换作为一种前沿的数据分析工具,近年来在信号分析领域崭露头角。小波分析的理论和方法凭借其独特优势,在信号处理、图像处理、语音处理、模式识别以及量子物理等多个领域得到了广泛的应用,堪称近年来在工具及方法上的重大突破。小波变换以其多分辨率的特性,在时域和频域均展现出对信号局部特征的强大表征能力。通过伸缩和平移等运算过程,小波变换能够对信号进行多尺度聚焦分析,为非平稳信号的时频分析提供了一种有效手段。它允许我们由粗及细地逐步观察信号,从而精准地提取出有用信息。

qq_38614074的博客 2万+

基于IEEE39节点系统的风力发电机组并网改造与稳定性研究

本文研究了基于IEEE39节点系统的风力发电机组并网改造与稳定性问题。首先将系统工作频率从60Hz转换为50Hz,并对同步发电机、变压器、线路和负荷参数进行相应调整。随后将30、32、34、37号节点的同步发电机替换为不同容量的永磁同步发电机(PMSG)和双馈感应发电机(DFIG),详细建立了两种风电机组的数学模型和控制策略。通过Simulink仿真验证,改造后的系统能够稳定运行并满足并网要求。研究成果为大规模风电并网系统仿真提供了参考,对提高电力系统可再生能源消纳能力具有重要意义。

huanghm88的专栏 111

listview gridview 之ChoiceMode

HoneyComb3.0中支持ListView和GridView的多选操作(长按后进入ActionMode模式),并且可以对选中的ListView或GridView的条目     (Item)进行操作,比如:删除,修改等。   /**           * 设置多选模式。           */           mListView.setChoiceMode(

云淡风轻的博客 478

Agent Harness Engineering: AI Agent 执行管控与安全沙箱 原理与最佳实践

我们正站在计算范式转移的历史节点上。2024-2026 年间,AI 系统从被动的内容生成器(Generative AI)演变为主动的行动执行者(Agentic AI)。这一转变的根本特征是:根据 2026 年初的行业数据:然而,能力的提升伴随着风险的指数级增长。2024-2026 年间发生的多起标志性安全事件揭示了 Agent 系统的脆弱性:案例 1:Slack AI 数据外泄事件(2024 年 8 月)案例 2:制造业供应链攻击(2026 年 Q3)案例 3:Arup 深度诈骗案(2026 年 9 月)这

AI天才研究院 1670

android listview actionmode,安卓中的上下文操作模式ActionMode:email列表多选中用到的...

使用上下文操作模式上下文操作模式是ActionMode类的一个系统实现,它关注用户跟执行上下文操作的交互。当用户通过选择一个项目使这种模式成为可能的时候,一个上下文操作栏就会显示在屏幕的顶部,并展现出用户在当前被选择的项目上能够执行的操作。当这种模式成为可能时,用户能够选择多个项目(如果应用程序允许),或取消选择项目,并且可继续在Activity内浏览。当用户取消了所有选择的项目、按下BACK按钮...

weixin_36227730的博客 265

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

布局与控件(八)-ListView知多少(下)ChoiceMode详解

列表要常常用到单选或多选功能对吧?!ListView的Choice Mode你听说过吗?它已经自带选择功能了!那么什么又是模式多选?本文将详细的讲述ListView的各种选择功能,教你结合选择项如何指定背景颜色。

不积跬步无以至千里 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ListView的一些常用方法:setChoiceMode(),getCheckedItemPositions() 。

android控件之ListView(二) 标签: listviewandroidlistbuttoncallbackclass 2012-02-07 15:41 9856人阅读 评论(5) 收藏 举报  分类: android(86)  5)不同的呈现模式 我们修改ArrayAdapter的第二个显示的模式。另外可以通过getListView()获取L

zzq123686的专栏 5793

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android listview多选模式ChoiceMode

9.4 ListView的Choice ModeListView本身带有单选和多选功能,也就是说在单选模式下,它能够记住当前选中的唯一的列表项;在多选模式下,它能够记住目前选取的所有的列表项。这种选择模式共有4种CHOICE_MODE_NONE CHOICE_MODE_SINGLE CHOICE_MODE_MULTIPLE CHOICE_MODE_MULTIPLE_MODAL。使用setChoice

成长的味道 5125

Android三级目录、ListView单选/GridView单选、ListView多选/GridView多选

近日群里的小伙伴问我三级目录、Android三级目录、ListView单选/`GridView`单选、ListView多选/GridView多选怎么做,我跟他讲了下原理和思路他还是有点迷糊,后来我就动手给他写了一个Demo,这里也把这个Demo分享给大家。当然文中用的都是ListView,但是我相信当你看完了本博客,什么GridView、ListView什么单选多选都不在话下啊哈哈

布莱克‌ 8480

ListView的多选模式

ListView的多选需求需求驱动技术,最近在项目中又遇到这样一个需求,简单而言就是:遍历某个文件夹下的所有log文件,然后将它们通过微信发送给别人。 这个功能很容易实现,但是在实现过程中,我希望自己的产品使用起来更加的人性化,所有我添加了多文件压缩打包功能,多选,反选,全选等功能,这样使用者就可以更加合理选择自己需要的log了。 那么问题来了,ListView应该怎么实现多选功能呢? 上下文

crazychen的专栏 7885

菜单总结

三种菜单总结一. 选项菜单: 选项菜单是某个 Activity 的主菜单项, 供您放置对应用产生全局影响的操作,如“搜索”、“撰写电子邮件”和“设置”。 如果您开发的应用适用于 Android 3.0(API 级别 11)及更高版本,则选项菜单中的项目将出现在应用栏中。 默认情况下,系统会将所有项目均放入操作溢出菜单中。用户可以使用应用栏右侧的操作溢出菜单图标(或者,通过按设备“菜单”

技术上的那点事 474

ListView的单选、多选模式:以官方Demo为例

ListView的单选和多选模式使用频率比较高,这里介绍了官方Dmeo推荐的方式。

BrilliantEagle的专栏 3619

GridView的stretchMode属性

stretchMode属性值的作用是设置GridView中的条目以什么缩放模式去填充剩余空间。参数stretchMode 可选值为:none,spacingWidth,columnWidth, spacingWidthUniform 注意:spaceWidth和spacingWidthUniform是有差别的,下面通过一个例子说明一下,本人手机屏幕4.7英寸,分辨率为1280×720 1....

weixin_30647065的博客 293

GridControl之GridView(属性篇)(一)

DevExpress控件GridControl中GridView界面的一些属性

huasa2239635117的博客 1608

DEV控件:gridControl常用属性设置

DEV控件:gridControl常用属性设置 1.隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值 sValue=Table.Rows[gridView1.FocusedRowHandle][FieldName].ToString(); 3.数据只读 ...

weixin_33739541的博客 628

GridView 设置选中状态,安卓移动开发实验报告

if (PullToRefreshGridView.MODE_PULL_DOWN_TO_REFRESH == mPullRefreshGridView.getCurrentMode()) { Toast.makeText(MainActivity.this, “下拉刷新”, Toast.LENGTH_SHORT).show(); mPullRefreshGridView.onRefreshComplete(); } else if (mode == PullToRefreshGridView.MODE_PU

m0_66264798的博客 3494

Listview使用CHOICE_MODE_MULTIPLE_MODAL实现多选模式

(参考博客:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1105/1906.html) ListView 使用CHOICE_MODE_MULTIPLE_MODAL进入多选模式的实现:界面很简单,有一个简单的显示文本的容器以及一个checkbox。 实现的功能为:长按进入多选模式,进入多选模式后长按item、点击item、...

zenglanjing的博客 849
上一篇: 使用android SpannableStringBuilder实现图文混排,查看更多
下一篇: 程序猿12个人艰不拆的真相
fancylovejava
博客等级 码龄16年 1052粉丝 184原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值