怎么实现类似新浪微博里面的点击@或者##实现跳转,但是点击其他文字触发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,请各位大仙帮帮忙
该回复引自免费微信小程序-皆我百晓生:
将以下内容重新排版发我:
实现类似新浪微博点击@或者##跳转,但点击其他文字触发ListView的onItemClick,可以使用以下步骤1. 在TextView的点击事件中判断点击的文字是否是需要跳转的文字,如果是,则执行跳转操作;如果不是,则将点击事件传递给ListView2. 在TextView的点击事件中,判断点击的文字是否是需要跳转的文字可以使用正则表达式来匹配。例如,匹配@某人和#话题的正则表达式可以是:\@[^\s::]+[::\s] 和 \#{1}[^\s:#]+#{1}3. 如果点击的是@某人或者#话题的文字,则执行相应的跳转操作。可以使用SpannableString来实现对特定文字的点击事件下面是修改后的代码示例```javapublic 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 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(\张三 李四#来嘛#的是滴是滴@我靠 山东省电脑\ list.add(\张三 李四#来嘛#的是滴是滴@我靠 山东省电脑\ MyAdapter adapter=new MyAdapter(context,list listview.setAdapter(adapter listview.setOnItemClickListener(this // 设置TextView可点击 TextView textView = (TextView)findViewById(R.id.text textView.setMovementMethod(LinkMovementMethod.getInstance @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 private List list public MyAdapter(Context context,Listlist 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 return convertView public class TextUtil public static SpannableString formatContent(CharSequence text, Context context) SpannableString spannableString = new SpannableString(text // 匹配@某人的正则表达式 Pattern atPattern = Pattern.compile([^\s::]+[::\s]\ Matcher atMatcher = atPattern.matcher(spannableString // 匹配#话题#的正则表达式 Pattern topicPattern = Pattern.compile(#{1}[^\s:#]+#{1}\ Matcher topicMatcher = topicPattern.matcher(spannableString // 设置@某人的点击事件和高亮效果 while (atMatcher.find()) final String match = atMatcher.group spannableString.setSpan(new ClickableSpan() @Override public void onClick(View widget) Log.i(\at\点击了@\ + match.substring(1 @Override public void updateDrawState(TextPaint ds) super.updateDrawState(ds ds.setUnderlineText(false ds.setARGB(255, 255, 0, 0 }, atMatcher.start.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE // 设置#话题#的点击事件和高亮效果 while (topicMatcher.find()) final String match = topicMatcher.group spannable