2 madui49782645811 madui49782645811 于 2013.09.25 09:56 提问

怎么实现类似于新浪点击@字体跳转,点击别的字体触发listview的onItemCliclk

怎么实现类似新浪微博里面的点击@或者##实现跳转,但是点击其他文字触发listview的onitemclick,我现在能实现的点击@,##跳转,点击listview的Item的空白处可以触发onItemClick,但是点击TextView上别的文字不行,代码如下:

public class MainActivity extends Activity implements OnItemClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Context context=this;
            setContentView(R.layout.activity_main);
            ListView listview=(ListView)findViewById(R.id.list);
             ArrayList<String> list=new ArrayList<String>();
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑地方活动经费看京东方看见您发到您看见烦恼的烦恼看能否看闹洞房放得开能发到您方面的能发,没地方防盗门南方的买奶粉,的买奶粉,买电脑,吗发到您防盗门内分泌,单方面, 发的摩奴法典麻烦您的,魔女发冠,们东南方防盗门南方的买奶粉满脑袋发的,摩奴法典们内分泌");
            list.add("@王五 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@马六 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@李二 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@大一 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            list.add("@张三 李四#来嘛#的是滴是滴@我靠 山东省电脑");
            MyAdapter adapter=new MyAdapter(context,list);
            listview.setAdapter(adapter);
            listview.setOnItemClickListener(this);

    }

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            // TODO Auto-generated method stub
            Log.i("madui","点击了item");
    }

}

public class MyAdapter extends BaseAdapter{
private Context context;
List list;

    public MyAdapter(Context context,ArrayList<String>list){
            this.context=context;
            this.list=list;
    }

    @Override
    public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
    }

    @Override
    public Object getItem(int position) {
            // TODO Auto-generated method stub
            return position;
    }

    @Override
    public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

            // TODO Auto-generated method stub
            convertView=LayoutInflater.from(context).inflate(R.layout.item, null);
            TextView text=(TextView)convertView.findViewById(R.id.text);
            text.setText(TextUtil.formatContent(list.get(position),context));
            text.setMovementMethod(TextViewFixTouchConsume.LocalLinkMovementMethod.getInstance());
            ((ViewGroup)convertView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);


            return convertView;
    }

}

public class TextUtil {
public static SpannableString formatContent(CharSequence text,Context context) {
SpannableString spannableString = new SpannableString(text);
final Context cont=context;
String s=text.toString();
/*
* @[^\s::]+[::\s] 匹配@某人 \[[^0-9]{1,4}\] 匹配表情
*/
Pattern pattern = Pattern.compile("@[^\s::]+[::\s]|\[[^0-9]{1,4}\|@[^\s: ]+[: \s]|#{1}[^\s:#]+#{1}|#{1}[\u4e00-\u9fa5_a-zA-Z0-9]+#{1}");
Matcher matcher = pattern.matcher(spannableString);
// spannableString.setSpan(new ForegroundColorSpan(Color.RED),
// matcher.start(), matcher.end(),
// Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.i("spannableString",text.length()+"");
//

while (matcher.find()) {
final String match=matcher.group();
if(match.startsWith("@")){ //@某人,加亮字体

                    final String nickName=text.toString().substring(matcher.start(), matcher.end());

                    spannableString.setSpan(new ClickableSpan(){

                            @Override
                            public void onClick(View widget) {
                                    // TODO Auto-generated method stub
                                    Log.i("at","点击了@");


                            }

                            @Override
                            public void updateDrawState(TextPaint ds) {
                                    // TODO Auto-generated method stub
                                    super.updateDrawState(ds);
                                    ds.setUnderlineText(false);
                                    ds.setARGB(255, 255, 0, 0);

                            }


                    },matcher.start(), matcher.end(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);


                    }else if(match.startsWith("[")){ //表情
                            String key = match.substring(1, match.length() - 1);

// if (Face.getfaces(context).containsKey(key)) {
// spannableString.setSpan(new ImageSpan(context, Face.getfaces(
// context).get(key)), matcher.start(), matcher.end(),
// Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// }
}
else if(match.startsWith("http://")){
spannableString.setSpan(new ForegroundColorSpan(0xff0077ff),
matcher.start(), matcher.end(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
else if(match.startsWith("#")){

                            final String keyWords=text.toString().substring(matcher.start()+1, matcher.end());
                            spannableString.setSpan(new ForegroundColorSpan(Color.RED),
                                            matcher.start(), matcher.end(),
                                            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                            spannableString.setSpan(new ClickableSpan(){

                                    @Override
                                    public void onClick(View widget) {
                                            // TODO Auto-generated method stub
                                            Log.i("at1","点击了##");


                                    }

                                    @Override
                                    public void updateDrawState(TextPaint ds) {
                                            // TODO Auto-generated method stub
                                            super.updateDrawState(ds);
                                            ds.setUnderlineText(false);
                                            ds.setARGB(255, 255, 0, 0);

                                    }


                            },matcher.start(), matcher.end(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

                    }

            }



            return spannableString;
    }

}

布局文件
activity_main
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<ListView
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
   />

item
<?xml version="1.0" encoding="utf-8"?>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp" >

<TextView
    android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="张三@李四 你好吗#山东黄金#山东黄金定时开机@朱芳雨"
      />

参照网上唯一的一种方法也不行,解决办法如下,但是不起作用
http://my.oschina.net/djone/blog/145057,请各位大仙帮帮忙

Csdn user default icon
上传中...
上传图片
插入图片