Android ListView对于单纯列表展示是很好用的,但是一旦牵扯到对listView进行操作就会遇到各种各样的问题。比如保存Checkbox状态与item复用的冲突、遇到可获取焦点的控件比如说button、edxttext等与listView本身的点击事件冲突等。对于后者,这里不研究原因,只提供解决方案。

如果listView之中只有button这样会抢夺焦点的控件,最好的建议是直接把button换成Textview,直接规避焦点问题。

如果有些产品经理要求在listview的item中提供复杂操作,比如输入、单选复选等,这里提供一个简单的同时响应按钮控件,并且响应listView的onItemClick事件的解决方法:为整个ListItem添加OnTouch事件,在事件中将所有可能抢夺焦点的控件设置为不可获取焦点。这样就可以保证liistView响应OnItemClick事件,再对每个可能获取焦点的控件设置OnTouch事件,在之中将其设置为可获取焦点,注意对Button等在手指离开的时候要将其失去焦点。

具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    if (view instanceof EditText) {
         //EditText设置为可焦点
         EditText editText = (EditText) view;
         editText.setFocusable(true);
         editText.setFocusableInTouchMode(true);
    else if(view instanceof Button || view instanceof RadioButton ) {
        //设置为可焦点,手指抬起时设为不可焦点
        if(motionEvent.getAction() == MotionEvent.ACTION_UP){
            view.setFocusable(false);
            view.setFocusableInTouchMode(false);
        }else{
            view.setFocusable(true);
            view.setFocusableInTouchMode(true);
        }
    }else {
        ViewHolder holder = (ViewHolder) view.getTag();
        //将所有有可能获取焦点的控件的setFocusable和setFocusableInTouchMode方法设为false
        setEditTextFoucsableFalse(holder);
    }
    return false;
}

注:如果存在EditText,为了保证输入法正常弹出,需要设置android:windowSoftInputMode="adjustPan"

结伴旅游,一个免费的交友网站:www.jieberu.com

推推族,免费得门票,游景区:www.tuituizu.com

Android ListView焦点事件冲突问题与解决的更多相关文章

  1. Android开发(十六)——Android listview onItemClick事件失效的原因

    参考: Android listview onItemClick事件失效的原因.http://blog.csdn.net/wangchun8926/article/details/8793178

  2. webview滑动事件 与内部html左右滑动事件冲突问题的解决办法

    最近在做个混合app , 用html做页面,然后通过webview嵌套在activity中,效果是这样: 开始还是比较顺利,增加了菜单退出按钮,返回键页面回退功能,页面加载显示加载图标(在app端实现 ...

  3. Android ListView 和 ScrollView 冲突问题

    近期做一款APP,当中有一个类似微博的评论功能的界面,先是列出微博的正文内容和图片等.然后下边是评论. 一開始就想着用一个ScrollView把主要内容和评论区的ListView包起来.然后加入各个控 ...

  4. input中blur失去焦点事件与点击事件冲突时如何解决

    方法一 使用setTimeout $(function(){ $(".cy-name-input input").on({ focus:function() { $(". ...

  5. scrollview嵌套listview 滑动事件冲突的解决方法

    listView.setOnTouchListener(new View.OnTouchListener() {                            @Override       ...

  6. Android View的事件冲突

    上一篇博客讨论了一下view中的事件分发,既然存在事件分发的过程,那么也就可能存在着冲突.常见的由以下三种形式的冲突.(外面叫做OuterViewGroup,包裹在里面的叫做InnerViewGrou ...

  7. ScrollView与ListView的事件冲突

    布局文件 当ListView嵌套在ScrollView中时,会发生冲突,导致ListView控件的拉动效果消失‘ 解决办法: 重写ListView的onTouchEvent(),并在返回前调用getP ...

  8. (转载)Android滑动冲突的完美解决

    Android滑动冲突的完美解决 作者:softwindy_brother 字体:[增加 减小] 类型:转载 时间:2017-01-24我要评论 这篇文章主要为大家详细介绍了Android滑动冲突的完 ...

  9. Android Listview中Button按钮点击事件冲突解决办法

    今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来. 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录 ...

随机推荐

  1. python+selenium下弹窗alter对象处理02

    首先使用switch_to.alert()方法进行定位,然后可以使用下面的操作 text:返回alert.confirm.prompt中的文字信息: accept():接受现有警告框: dismiss ...

  2. 创建React脚手架

    node版本10.14.2 下载地址 如果是其版本的话会出错 css-loader 会不兼容 主要是8.x的版本不兼容 npm install -g create-react-app 全局安装 cre ...

  3. Spark-Core RDD依赖关系

    scala> var rdd1 = sc.textFile("./words.txt") rdd1: org.apache.spark.rdd.RDD[String] = . ...

  4. java常用类之BigDecimal

    BigDecimal 小数计算丢失精度问题 在计算机中,所有文件都是以二进制存储的,数字运算也是使用二进制进行计算的,因为计算机中不存在小数点,所以我们通常说的浮点数如float.double都是计算 ...

  5. 去掉img与img之间,video与video之间默认的间距(3种方式)

    img,video{ /*第1种方式*/ border:; vertical-align: bottom; /*第2种方式*/ outline-width:0px; vertical-align:to ...

  6. xss过滤与单例模式(对象的实例永远用一个)

    kindeditor里面可以加入script代码,使用re可以过滤掉python有个专门的模块可以处理这种情况,beautifulsoup4 调用代码: content = XSSFilter().p ...

  7. 生成EXCEL文件是经常需要用到的功能,我们利用一些开源库可以很容易实现这个功能。

    方法一:利用excellibrary,http://code.google.com/p/excellibrary/ excellibrary是国人写的开源组件,很容易使用,可惜貌似还不支持.xlsx( ...

  8. [七月挑选]写个定时任务,从github下载代码到阿里ECS服务器上

    title: 写个定时任务,从github下载代码到阿里ECS服务器上 根据前几篇博客中能自己创建一个博客,并在github.io上访问到自己的博客,但是如果自己有服务器,那怎么能定时获取github ...

  9. Linux 下编写.sh文件运行JAR下的Class

    #!/bin/sh #bash文件头 APP_HOME=/opt/CrxToMongodb #目录是/opt/CrxToMongodb CLASSPATH=$APP_HOME #bin目录当然是包含j ...

  10. 关于cron4j的使用

    cron4j的主要实体是调度程序.使用it.sauronsoftware.cron4j.scheduler实例,您可以在一年中的固定时间执行任务.调度程序可以每分钟执行一次任务,每五分钟执行一次,星期 ...