怎么实现类似新浪微博里面的点击@或者##实现跳转,但是点击其他文字触发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,请各位大仙帮帮忙