android - ListView的Item会出现点击两次的问题,大家是怎么解决的?
巴扎黑
巴扎黑 2017-04-17 15:42:03
[Android讨论组]

有时候新开一个Activity有点慢,然后就出现了ListView的Item两点两次然后跳出了两个Activity的问题。

巴扎黑
巴扎黑

全部回复(6)
PHP中文网
if (本次点击的时间 - 上次点击的时间 >= 阈值) {
    上次点击的时间 = 本次点击的时间;
    执行点击操作();
}

伪代码。。。写得自己都看不下去了。(捂脸)

ringa_lee

拦截短时间的多次点击操作;
设置flag;
尽量优化新起界面的初始化操作。

阿神

方案有两种,
方案一: 直接自定义监听器,适用于大量此类操作。
方案二: 直接在方法里拦截,适用于少量此类操作。

方案一:

自定义一个监听器NoDoubleClickListener,抽象一个 onNoDoubleClick 方法。

public abstract class NoDoubleClickListener implements View.OnClickListener {

    public static final int DELAY = 10000;  //连击事件间隔
    private long lastClickTime = 0; //记录最后一次时间

    @Override
    public void onClick(View v) {
        long currentTime = System.currentTimeMillis();
        if (currentTime - lastClickTime > DELAY) {  //判断时间差
            lastClickTime = currentTime;  //记录最后一次点击时间
            onNoDoubleClick(v);
        }
    }

    //抽象一个无连击事件方法,用于实现内容
    public abstract void onNoDoubleClick(View v);
}

用法,在建立监听的时候使用刚刚自定义的监听器,并实现其抽象方法。

view.setOnClickListener(new NoDoubleClickListener() {

                    @Override
                    public void onNoDoubleClick(View v) {
                        //你的代码
                    }
                });

方案二:

把方案一的时间差判定方法拿出来。。就行了。。

public class Utils {
    public static final int DELAY = 1000; 
    private static long lastClickTime = 0; 
    public static boolean isNotFastClick(){
        long currentTime = System.currentTimeMillis();
        if (currentTime - lastClickTime > DELAY) { 
            lastClickTime = currentTime; 
            return true;
        }else{return false;}
    }
}

用法,

view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(Utils.isNotFastClick()){
                            //你的代码
                        }
                    }
                });

按照java的设计原则,推荐第一种方案。
其他监听也是同样的自定义方式。

PHP中文网
ListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
                view.setEnabled(false);
                view.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        view.setEnabled(true);
                    }
                }, 300);
        }
黄舟

两个结合处理。判断是否快速点击,再设置跳转页面的启动模式launchModel!

public class CalcUtils {
    private static long lastClickTime;

    //防止重复点击 事件间隔,在这里我定义的是1000毫秒
    public static boolean isFastDoubleClick() {
    long time = System.currentTimeMillis();
    long timeD = time - lastClickTime;
     if (timeD >= 0 && timeD <= 500) {
        return true;
     } else {
        lastClickTime = time;
        return false;
     }
    }
}
ringa_lee

直接在AndroidManifest.xml中声明Activity的时候,launchMode指定为singleTop,能够解决大部分情况下打开多次的问题了;
但是如果你们的QA要是非得狂点的话,还是会出现的.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号