ontouchevent-ListView的item中实现@功能,点击时跳转执行两次的问题,

问题描述

ListView的item中实现@功能,点击时跳转执行两次的问题,

下面是一个自定义的TextView:
`public class TextViewFixTouchConsume extends TextView {

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

public TextViewFixTouchConsume(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public TextViewFixTouchConsume(Context context, AttributeSet attrs,
        int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

  if (getMovementMethod() == null ) {
        boolean result = super.onTouchEvent(event);
        return result;
    }

    MovementMethod m = getMovementMethod();
    setMovementMethod(null);

    boolean mt = m.onTouchEvent(this, (Spannable) getText(), event);
    if (mt && event.getAction() == MotionEvent.ACTION_DOWN) {
        event.setAction(MotionEvent.ACTION_UP);
        mt = m.onTouchEvent(this, (Spannable) getText(), event);
        event.setAction(MotionEvent.ACTION_DOWN);
    }

    boolean st = super.onTouchEvent(event);

    setMovementMethod(m);
    setFocusable(false);

    return mt || st;
}

}`
下面是在adapter中写的代码:

mHolder.content.setText(parser.replace(string, true));
        mHolder.content.setMovementMethod(LinkMovementMethod.getInstance());

下面是replace方法以及自定义的ClickableSpan:

public CharSequence replace(CharSequence text, boolean flag) {
    text = Html.fromHtml(MicroblogUtil.getLinkString(text.toString()));
    SpannableStringBuilder builder = new SpannableStringBuilder(text);
    if (flag) {
        if (text instanceof Spannable) {
            int end = text.length();
            // 其实就是得到sp1
            Spannable sp = (Spannable) text;
            // 得到其中所有的关键字的数组
            URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
            // 清楚掉所有的关键字标志
            builder.clearSpans();
            for (URLSpan url : urls) {
                // 将关键字数组中的文字添加到新生成的style中去
                MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
                builder.setSpan(myURLSpan, sp.getSpanStart(url),
                        sp.getSpanEnd(url),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    } else {
        Matcher matcher = mPattern.matcher(text);
        while (matcher.find()) {
            int resId = mSmileyToRes.get(matcher.group());
            builder.setSpan(new ImageSpan(mContext, resId),
                    matcher.start(), matcher.end(),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    return builder;
}

/**
 * 继承于可点击的标签
 *
 * @author excuce
 *
 */
private class MyURLSpan extends ClickableSpan {
    private String mUrl;

    /**
     * 构造器
     *
     * @param url
     *            可以点击的关键字,构造时传入的
     */
    public MyURLSpan(String url) {
        mUrl = url;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setColor(ds.linkColor);
        ds.setUnderlineText(false);// <span
                                    // style="color: red;">//去掉下划线</span>
    }

    @Override
    public void onClick(View widget) {
        // System.out.println(mUrl.trim().substring(ONE));
        Intent intent = new Intent(mContext, WeiBoPersonalActivity.class);
        intent.putExtra(KEY_NAME, mUrl.trim().substring(ONE));
        mContext.startActivity(intent);
        // Log.d("MyURLSpan", "MyURLSpan");
    }
}

帮忙看看是怎么回事?这个方法我在模拟器上面试过没有出现跳转两次的问题,但在真机上出现了。

解决方案

@Override
public boolean onTouchEvent(MotionEvent event) {

    int action = event.getAction();
    boolean flag = false;

    switch (action) {
    case MotionEvent.ACTION_DOWN:
        MovementMethod m = getMovementMethod();
        setMovementMethod(null);
        boolean mt = m.onTouchEvent(this, (Spannable) getText(), event);
        if (mt) {
            event.setAction(MotionEvent.ACTION_UP);
            mt = m.onTouchEvent(this, (Spannable) getText(), event);
            event.setAction(MotionEvent.ACTION_DOWN);
        }
        boolean st = super.onTouchEvent(event);
        setMovementMethod(m);
        setFocusable(false);
        flag = mt || st;
        break;
    default:
        break;
    }
    return flag;
}

改一下这个方法就行!

时间: 2024-10-30 12:19:14

ontouchevent-ListView的item中实现@功能,点击时跳转执行两次的问题,的相关文章

android点击消除当前item界面,然后在另一个listView的item中显示

问题描述 android点击消除当前item界面,然后在另一个listView的item中显示 android 中点击listview的Item中按钮后在当前listview中消除,并且传到另外一个listview中显示出来 解决方案 把item对应的data内容移除,另一个listview中加入对应数据. 两个listview都notifyDataSetChanged刷新 解决方案二: http://www.tuicool.com/articles/226rem 解决方案三: 这个应该好实现吧

Android ListView的item中嵌套ScrollView的解决办法_Android

 前沿:有时候,listview 的item要显示的字段比较多,考虑到显示问题,item外面不得不嵌套ScrollView来实现,于是问题来了,当listview需要做点击事件时,由于ScrollView的嵌套使用,拦截了listvew点击事件:只好重写listview来实现了. /** * * @author 作者:易皇星 * * @da2016年10月24日 时间: * * @toTODO 类描述: 解决 ListView中嵌套ScrollView,ScrollView拦截ListView的

Android ListView的item中嵌套ScrollView的解决办法

前沿:有时候,listview 的item要显示的字段比较多,考虑到显示问题,item外面不得不嵌套ScrollView来实现,于是问题来了,当listview需要做点击事件时,由于ScrollView的嵌套使用,拦截了listvew点击事件:只好重写listview来实现了. /** * * @author 作者:易皇星 * * @da2016年10月24日 时间: * * @toTODO 类描述: 解决 ListView中嵌套ScrollView,ScrollView拦截ListView的I

高德地图中如何把map放到每个Listview的item中

问题描述 高德地图中如何把map放到每个Listview的item中 我的MainActivity的代码public class MainActivity extends FragmentActivity { private ListView listView; private BaseAdapter baseAdapter; private LayoutInflater mlayoutInflater; private AMap aMap; private MapView mapView; S

监听-listview item中是有EditText改变时获取Postion?

问题描述 listview item中是有EditText改变时获取Postion? listview item中是有EditText, 怎么在监听每个EditText的时候获取这个EditText的Postion? 解决方案 getview时,可以给这个edittext的tag赋值postion,然后取出tag得到postion 解决方案二: 不是本地爸爸的话大把大把差不多你都能 解决方案三: 用ListView 不要重用ConvertView

解决android Listview的item中最外层Margin失效的问题

1.在开发中发现这么一种现象: List中的Item是LinearLayout,这个Item的最外层,设置了margin属性.全部失效. 从图中可以看出, AbsListView的layoutparam不包含有Margin信息.包含有margin的layout是正常的几个基础布局. 解决方案: 在你的listview里面加上下面代码 android:divider="#00000000" android:dividerHeight="10dp" android:la

PowerPoint2013中如何在播放幻灯片时跳过某些幻灯片

  有些时候,我们会希望只播放某些幻灯片,还有些幻灯片是不需要播放的,但我们又不希望将这些幻灯片删除掉,因为删了就再也没有了不是吗?想解决这些烦恼吗?进来看看吧! 操作步骤很简单的: 1.用PowerPoint2013打开一篇文稿,并选中我们需要隐藏的幻灯片,切换到"幻灯片放映"选项卡,单击"设置"区域中的"隐藏幻灯片"按钮. 2.现在,我们隐藏的幻灯片的颜色会变淡,而且它的页码上会出现一个删除符号,如果我们放映幻灯片的话,就会发现这一页幻灯片并

中电信下月1号推天翼国际卡执行两项收费标准

11月30日消息,工业和信息化部今天发布公告称,为改善客户感知,使客户享受到"更优惠的资费,更广泛的覆盖",中国电信集团公司决定于2010年12月1日起,推出与沃达丰公司合作的天翼国际卡(新),按新卡新资费.老卡老资费的原则,对天翼国际卡(新).原天翼国际卡.**133业务.国际及港澳台地区呼叫转移业务执行新的收费标准. 公告显示,此次推出的天翼国际卡(新)业务采取两种收费标准:C-G国际及港澳台地区漫游资费标准.C-C国际及港澳台地区漫游资费标准.2010年12月1日以后办理的天翼国

Android 中ListView的Item点击事件失效的快速解决方法_Android

在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布局和自定义adapter了,一般是继承于BaseAdapter,示例代码见下方.写ListView的点击事件时OnItemClickListener,onItemClick方法没有执行,导致ListView中Item条目点击事件失效,而Item中的View点击事件可以在getView方法中进行处理.导致整个Item点击失效的原因多半是由于在[你自己定义的Item中存在诸