ListView的Item会出现点击两次的问题,大家是怎么解决的?

pigLoveRabbit
  • 6.7k

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

回复
阅读 8.8k
6 个回答
✓ 已被采纳
if (本次点击的时间 - 上次点击的时间 >= 阈值) {
    上次点击的时间 = 本次点击的时间;
    执行点击操作();
}

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

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);
        }
_betterlee_lee
  • 1
新手上路,请多包涵

拦截短时间的多次点击操作;
设置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的设计原则,推荐第一种方案。
其他监听也是同样的自定义方式。

两个结合处理。判断是否快速点击,再设置跳转页面的启动模式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;
     }
    }
}

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

宣传栏