Android开发之PullToRefresh的Click点击事件的监听实现长按删除Item

飞控算法-姿态解算之互补滤波 飞控乱入之姿态解算 姿态解算是通过读取各个传感器的数据进行融合最终得到当前飞行器的姿态,姿态通常用Euler角(Roll-Pitch-Yaw)来表示 姿态解算框架 姿态解算的数据源可来自于陀螺仪或加速度计,他们分别都可以得到当前姿态,但实际上他们都有各自的传感器性能的优缺点,需要取长补短,进行数据融合才能得到真实的姿态,这种方法简称 互补滤波 算法 传感器特性 互补滤波 姿态解... 阅读详情

本文为原创博客,出自http://blog.youkuaiyun.com/minimicall

到今天为止,搜芽的卖家版本应该来说已经基本完成,攻坚克难的一路过来。速度也控制的比较好。

项目过程进度





从任务分配量上来看,基本还是我个人英雄主义。接下来这样不行。但暂时也没办法,师弟还需要一个学习的过程。智质不错,而且态度端正。相信搜芽买家,他就可以承担更多的开发任务了。


接下来进入正题,说我们的PullToRefresh的点击事件。其实,我是想做长按进入删除的。

见效果图。当然这个是我做出来之后的了,但做出来不容易。

效果图

先上效果图



这个时候,用户长按某个item,进入删除选中模式。


这个时候ActionBar上的菜单发生了变化,变成了一个全选和删除。


我们还可以点击ActionBar全选来选择所有Item


当然,你可以取消全选这个时候,你也可以单机某个Item取消该项。

选中了,然后按删除菜单,就是那个垃圾桶图标即可。就会删除,删除同步至服务器。

问题出先了。发现点击无效。。!

问题排查

网上很多方法。

第一个比较有用的是:http://www.tuicool.com/articles/ria6Zf


     记录下自己所犯的错误,在写ListView的点击事件时OnItemClickListener,onItemClick方法没有执行,导致ListView条目点击事件失效,检查发现百度上有很多不同的答案,但究其本质都是ListView的Item抢占焦点或者Item没有获取焦点甚至没有绑定上OnItemClickListener监听事件,而我所犯的错误是在ListView的Item布局中引入了一个Style,在Style中有一项<item name="android:clickable">true</item>,正是这一项导致所有Item都要抢占焦点,所以ListView的点击事件失效,在我去掉这一项之后ListView确实正常工作了。需要引以为戒的是,在androidl应用开发中,焦点没有获取或者其他组件抢占焦点的事情经常发生,我们可以在代码中,xml布局中,甚至Style中定义时候抢占焦点,在一般情况下,这个设置并不会造成什么异常,但我需要注意重要的组件在合适的时机必须拿到焦点,否则会产生意想不到的后果,比如我的ListView。一般组件获取焦点可以使用一下方法:

[java]    view plain  copy
  1. View.setFocusable( true ),对应xml : android:focusable= "true" .                                
  2. View.setFocusableInTouchMode( true ),对应xml : android:focusableInTouchMode= "true" .   

注意:这两个属性要同时使用。

两者的意思是让组件可以获得焦点。不过有些区别,前者执行false条件后,在执行true,还是不能获取焦点。后者执行上述过程,还是能获取焦点。  
当你加入上述代码后,在创建activity时,调用对应view的requestFocus(),(requestFocus()需要在setContentView之后执行 )这样就可以获得焦点了。当editText失去焦点了,也就不会有软键盘了 

但针对ListView还可以使用 android:descendantFocusability 属性, 下面我们来看一下 android:descendantFocusability用法简析

以下摘自: http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html

        开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点。原因多半是由于在你自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。

这时候就可以使用descendantFocusability来解决啦,API描述如下:

android:descendantFocusability

Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.

Must be one of the following constant values.

该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。

属性的值有三种:

        beforeDescendants:viewgroup会优先其子类控件而获取到焦点

        afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

        blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了,至此listview点击的灵异事件告一段落。心得:遇到不会不懂的地方除了网上查询资料之外,也可以多多去尝试每种属性的作用,多阅读官方文档(我始终觉得还是读原文的比翻译的理解的会更好)

第二个比较有意的是:

http://blog.youkuaiyun.com/kankankankan2222/article/details/7693190

如果ListView中的单个Item的view中存在checkbox,button等view,会导致ListView.setOnItemClickListener无效,

事件会被子View捕获到,ListView无法捕获处理该事件.

解决方法:

在checkbox、button对应的view处加android:focusable="false"
   android:clickable="false"android:focusableInTouchMode="false"

其中focusable是关键

 

从OnClickListener调用getSelectedItemPosition(),Click 和selection 是不相关的,Selection是通过D-pad or trackball 来操作的,Click通常是点击操作的。

 我犯得错是自己在getView里面不小心设置了对Click的监听导致的。已经被我注释掉了

//    private class ClickListner implements OnClickListener {
//        private int position;
//
//        private ClickListner(int position) {
//            this.position = position;
//        }
//
//        @Override
//        public void onClick(View v) {
//        	Log.d(TAG,"xxxxxxxxxxx");
//            MCloth cloth = mCloths.get(position);
//            if (!isEnabled(position)) {
//                return;
//            }
//            Context context = v.getContext();
//            //DetailActivity.launch(context, movie, Referer.NEW_ARRIVIAL);
//        }
//    }
接下来我讲一下,如何实现PullToRefresh来实现长按进入删除选中模式。

长按进入删除模式

首先,在需要初始化View各种监听的地方,我们开一个函数。如下,相信大家都熟悉,

	private void setupViews(View rootView) {
		mListView = (PullToRefreshListView) rootView
				.findViewById(R.id.cloths_lv);
		mListView.setMode(PullToRefreshBase.Mode.BOTH);
		((ViewGroup) mListView.getParent()).addView(mErrorView);
		mListView.setEmptyView(mErrorView);
		mClothManageAdapter = new ClothManageAdapter(getActivity(),
				getImageFetcher());
		mListView.setAdapter(mClothManageAdapter);
		((MainActivity) getActivity()).getIndicator().setOnTabSelectedListener(
				mTabSelectdListener);
		mProgressBar = (ProgressBar) rootView.findViewById(R.id.pb_progress);

		setListViewRefresh();
		setLongClickListener();
	}

我们把注意力放到setLongClickListener上,这个是我封的一个private方法,如下:

	private void setLongClickListener() {
		Log.d(TAG, "setLongClick");
		mListView.getRefreshableView().setOnItemClickListener(
				mOnItemClickListener);//单击事件的监听
		mListView.getRefreshableView().setChoiceMode(
				ListView.CHOICE_MODE_MULTIPLE_MODAL);//选择模式选为可多选
		mListView.getRefreshableView().setMultiChoiceModeListener(
				mMutilChoiceListener);//多选监听

	}
好,我们再进一步看单击时间的监听

	private final OnItemClickListener mOnItemClickListener = new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			if (mActionMode == null) {//还没有按长按的时候,走这里。
				Log.d(TAG, "onItemClick,mActionMode is null");
			} else {//已经有了一次长按之后,进入了选择模式,走这里
				Log.d(TAG, "onItemClick,mActionMode is  not null, select item "
						+ position + " to select");
				mListView.getRefreshableView().setItemChecked(position, true);

			}
		}
	};
好,我们看我们很关键的多选监听。直接上代码

	private final MultiChoiceModeListener mMutilChoiceListener = new MultiChoiceModeListener() {
		@Override
		public boolean onCreateActionMode(ActionMode mode, Menu menu) {
			Log.d(TAG, "onCreateActionMode, mode:" + mode + ",menu:" + menu);
			mActionMode = mode;
			getActivity().getMenuInflater().inflate(
					R.menu.menu_favorite_delete, menu);//加载菜单到ActionBar中

			return true;
		}

		@Override
		public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
			return false;
		}

		@Override
		public void onDestroyActionMode(ActionMode mode) {
			mActionMode = null;
		}

		@Override
		public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
			switch (item.getItemId()) {//菜单点击事件
			case R.id.menu_delete: // 删除
				Log.d(TAG,"delete menu");
				List<MCloth> deleted = new ArrayList<MCloth>();
				SparseBooleanArray checked = mListView.getRefreshableView()
						.getCheckedItemPositions();
				for (int i = 0; i < checked.size(); i++) {
					Log.d(TAG, "get from Adapter("+checked.keyAt(i)+","+checked.valueAt(i)+")");
					if (checked.valueAt(i)) {
						deleted.add(mClothManageAdapter.getItem(checked
								.keyAt(i)));
					}
				}
//				for (MCloth cloth : deleted) {
//					if(cloth != null){
//						//Log.d(TAG, "deleting the cloth id="+cloth.id+" in remote server now");
//						 WEBInterface1.DelCloth(cloth.id);
//					}
//				}
				new DeleteClothTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, deleted);
				mClothManageAdapter.remove(deleted);

				mode.finish();
				loadData(true);
				break;
			case R.id.menu_selectall: // 全选
				if (mIsSelectAll) {
					item.setTitle("取消全选");
					mIsSelectAll = false;

				} else {
					item.setTitle("全选");
					mIsSelectAll = true;
				}
				for (int i = 0; i < mListView.getRefreshableView().getCount(); i++) {
					mListView.getRefreshableView().setItemChecked(i,
							!mIsSelectAll);
				}
				break;
			}
			return true;
		}

		@Override
		public void onItemCheckedStateChanged(ActionMode mode, int position,
				long id, boolean checked) {
			setActionModeTitle(mode, mListView.getRefreshableView()
					.getCheckedItemCount());
		}

	};

	private void setActionModeTitle(ActionMode mode, int count) {
		Log.d(TAG, "setActionModeTitile,mode:" + mode + ",count:" + count);
		mActionMode.setTitle("选中" + count + "个布料");
	}
这样
核心的代码就是上面了,实现了长按删除的,效果不错吧。不懂的可以联系我。希望我们的搜芽产品能够一天天的长成大树。 晚安。有想加入我们团队的,也可以联系我。我会给你力所能及的帮助,也期待大家的愉快合作。










Python爬虫实战:高效爬取中国版权登记数据 本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的中国版权登记数据爬虫系统。我们将使用Playwright+Asyncio实现无头浏览器自动化,结合Redis分布式任务队列和MongoDB数据存储,打造一个能够应对反爬机制的企业级数据采集方案。文章包含完整代码实现、性能优化技巧以及法律合规建议,帮助开发者快速掌握大规模数据采集的核心技术。本文详细介绍了2024年使用Python最新技术栈构建中国版权登记数据爬虫的完整方案。基于Playwright的无头浏览器自动化。 阅读详情

相关推荐

史上最全的Logisim运算器实验教程(基于华中科技大学计算机组成原理实验)

本博客是实现了Logisim的运算器设计,有具体的运算器设计的思路和运算器设计的电路,适合一步一步的按照思路做。

qq_62325622的博客 4万+

Vant源码解析(三)van-stepper步进器

先说下自己的开发思路,然后在对照下vant组件的思路,来查找下自己的不足。这个步进器有加和减的功能,还有输入的功能,限制最小和最大的功能。

我的博客 2565

torchsparse安装

torchsparse安装以及安装失败原因分析和解决

AI_BING_的博客 1万+

今天使用PullToRefreshListView时遇到Item点击事件失效问题,特此记下解决办法

今天用PullToRefreshListView是遇到Item点击失效问题, <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" a

FUCK 3845

开源分享:苹果群控手机源代码解析与实战

本文介绍了苹果设备群控的基本原理和实现方法,重点解析了基于Python+Appium的群控系统构建。主要内容包括:1)设备连接管理技术(USB/Wi-Fi);2)自动化控制方式(WDA/AppleScript/Appium);3)实战演示了通过Python脚本实现多设备同时控制,涵盖环境配置、代码解析和功能说明;4)提出了多线程、图像识别等优化方向。文章为开发者提供了快速上手的群控方案,适用于自动化测试、批量管理等场景,并推荐了相关开源项目参考。

2403_88540309的博客 1344

MLC-LLM框架在安卓设备上的模型编译与部署全流程解析

本文详细解析了如何利用MLC-LLM框架在安卓设备上编译与部署大语言模型。从环境搭建、模型获取与量化编译,到最终的安卓应用打包与调试,提供了完整的实战流程。重点介绍了如何通过MLC-LLM将大型模型优化为适合移动端运行的格式,实现本地、低延迟、隐私安全的AI应用部署。

weixin_29251337的博客 475

PullToRefreshListView刷新数据和适配

PullToRefreshListView控件和PullToRefreshGridView控件,,,,一样使用,,,,,都一样;   PullToRefreshListView设置监听事件是:   /** * 如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、 * onPullU...

不知道的博客 455

ubuntu 24.04安装ros1 noetic

上面是参考链接给的修改内容。除了上面要修改的地方,我在编译的生活还有一个地方报错,修改成如下形式。因为我已经对文件rosconsole_log4cxx.cpp作了上面的修改,所有是不是188行不太确认了,如果报“log4cxx::spi::LocationInfo”问题,按照下面修改就可以了。我在编译时还报了一个问题,就是我之前安装的是jazzy。所以在编译时会报ros变量名不对,这时对变量名做修改就可以了。具体怎么修改,百度。a、将源文件中所有CMakelist中编译标准改为c++ 17.

yangpan011的博客 3207

PullToRefreshListView点击无效果

最近遇到一个很奇怪的问题,用PullToRefreshListView做列表,点击里面的子项没任何响应,还以为是PullToRefreshListView本身存在BUG,后来发现,即使用ListView也存在同样的问题!

淡然。的专栏 2091

特斯拉 Model 3解析(九)特斯拉 Model 3 自动驾驶域控制器硬件架构

硬件层:车规级高密度主板 → PI/SI优化到极致传感器层:三目摄像头主导视觉,雷达补充冗余,超声波保证近距设计理念:依靠芯片算力最大化视觉潜力,而不是堆传感器这套思路的优点是:成本可控、量产快、迭代快。缺点是:极端场景下感知鲁棒性不足。纯视觉方案短期可行,但中长期必然要重新引入高分辨率雷达甚至固态LiDAR作为冗余。电源/信号完整性会越来越关键,未来域控板设计会越来越像数据中心服务器。

weixin_43199439的博客 1785

被Cloudflare 5秒盾虐了半个月,终用Python破局:UA+TLS指纹伪装实战,拦截率从42%干到3%

其实5秒盾不难破,难的是摸透它的检测逻辑——它不是“一刀切”地拦截爬虫,而是通过“多维度指纹校验”,判断你是不是“真实用户”。表层:UA和HTTP头要完整、匹配;中层:TLS指纹要和真实浏览器一致(核心);深层:行为要符合人类习惯(请求间隔、JS执行)。这套方案不仅适用于Cloudflare 5秒盾,很多基于指纹检测的反爬系统(如Akamai、Imperva)也适用。2025年的爬虫,早已不是“能爬就行”,而是“爬得稳、不被封”——指纹伪装就是实现这一点的关键。

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

vant/vue手机端长按事件以及禁止长按弹出菜单

目录 手机端长按事件 禁止长按弹出菜单 手机端长按事件 先给两个事件 @touchstart="start" @touchend="end" 因为vue里的touchend没有封装,所以需要我们自己去写 方法如下: start() { clearTimeout(this.loop); //再次清空定时器,防止重复注册定时器 this.loop = setTimeout(() => { console.l..

NanChen的博客 4596

嵌入式u-boot最全面试题及参考答案(5万字长文持续更新)

例如,在一个便携式设备中,U-Boot 在启动时初始化电源控制器,将输出电压设置为合适的值。命令是u-boot构建过程中用于配置u-boot选项的命令。在嵌入式系统中,启动画面(也称为启动Logo或Splash Screen)是展示给用户的第一印象,它可以包含公司的标志、产品的名称或其他相关信息。u-boot允许通过环境变量来进行配置,这使得开发者可以根据不同的硬件平台和项目需求灵活地调整u-boot的行为。写入操作可以是字节级别的,也可以是块级别的,具体取决于设备的性能和操作系统的需求。

大模型大数据攻城狮的专栏 997

使用PullToRefreshListView遇到的坑

使用PullToRefreshListView需要注意的问题: 1.布局中宽高都使用match_parent,用wrap_content时Item不展示 2.添加头布局:上篇博客已经介绍 3.点击事件的position从1开始计算 (lv.setOnItemClickListener())

fsx_xiaomei的博客 880

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android PullToRefreshExpandableListView的点击事件

这几天做项目的时候用到了一个开源的下拉刷新的框架(需要的朋友可以加我Q:359222347)。其中我使用PullToRefreshExpandableListView的时候发现这个东西没有setOnChildClickListener()的点击方法。刚刚在一个国外的网站上看到一个解决的方法: mPullRefreshListView = (PullToRefreshExpandableLis...

weixin_33968104的博客 132

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

转载请注明出处:http://blog.youkuaiyun.com/sinyu890807/article/details/9255575 最近项目中需要用到ListView下拉刷新的功能,一开始想图省事,在网上直接找一个现成的,可是尝试了网上多个版本的下拉刷新之后发现效果都不怎么理想。有些是因为功能不完整或有Bug,有些是因为使用起来太复杂,十全十美的还真没找到。因此我也是放弃了在网上找现成代码的想法,...

runfeel 4980

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

让ListView中的控件失去焦点:android:descendantFocusability="blocksDescendants"

值得注意的是,ListView中的控件不能设置clickable="true",否则会无视父控件的blockDescendants。 可参考: https://segmentfault.com/q/1010000005800016 同理,如果一个cardview里面有个listview,这个listview如果设置了clickable="true",遮住cardview的部分也是无法响...

weixin_30409849的博客 268

pulltorefresh扩展下拉上拉刷新加载及监听listview滚动方向

很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性。查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷新和上拉加载更多。这个组件有个mode的属性,可以设置为both,即上下同时都可拉动。但是只设置这个属性的话,上拉与下拉产生的效果是完全一致的。所以要使用这个开源项目做到下拉刷新并同时可上拉加载更多,

fghydx的专栏 2543

下拉刷新列表PulltorefreshListView的长按操作OnItemLongClickListener()失效的解决办法

解决办法: 将PulltorefreshListview 转换为ListView  ListView actualListView = refreshlv.getRefreshableView(); actualListView.setOnItemLongClickListener(longClick);这样就可以监听长按操作了。 还有一点,就是,如何才能使listview长按

gongzhiyao37390814的博客 701

PullToRefreshListView增加侧滑删除功能

直接上步骤: 一:使用PullToRefreshListView实现上拉加载和下拉刷新 首先下载PullToRefreshListView:下载源码(https://github.com/chrisbanes/Android-PullToRefresh); 然后将该类库导入到项目中(导入方法就不再多说了); xml文件中添加代码:

niulijieniu的专栏 3857

Android自定义实现PullToRefreshRecycleView刷新加载控件原理和使用

写在前头:PullToRefresh这个下拉刷新上拉加载更多的控件相信大家并不陌生,Github上搜索也有很多相关的控件,并且star数量也不低,但是呢如果你想拥有很高的自由度的话,那么还是敌不过自己实现一个或者你能把开源的控件源码看明白然后基于上面自己修改成自己需要的样式,那么我就是干了这件事,在网上看到一篇博客,然后下载源码看了看,然后就想将它进行改造一番,那篇文章的地址我是真的找不到了...

我是紫色紫色的专栏 2万+

PullToRefresh 修改下拉动画 以及 轮播实现点击停止 和PullToRefreListView 的复杂布局

1,先来无事,复习了下 PullToRefresh先上效果图讲解:1,修改下拉上拉动画,上篇链接: http://blog.youkuaiyun.com/u013233097/article/details/533859862,实现 轮播点击事件停止:轮播触摸停止原理: 1,添加 ViewPager的点击事件。 //1,手指按下时: 获取 当前点击点 坐标 手指触摸时停止滑动 并移除handl

一条咸鱼 1138

GridView的点击事件冲突解决

在开发的时候,经常可能遇到ListView或GridView控件点击事件与Item点击事件冲突的问题。原因是Item布局中的button或ImageButton强制获取了item的焦点,解决方式之一是:只要设置Item布局中的button的focusable为false即可,另外可以在Item布局的根节点添加属性android:descendantFocusability="blocksDesce

true100的专栏 8779
上一篇: 深入浅出Docker(1)----Docker核心技术预览
下一篇: Android开发之布局文件中实现OnClick事件关联处理方法
minimicall
博客等级 码龄18年 407粉丝 174原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值