madui49782645811 2013-09-25 01:56 采纳率: 0%
浏览 1724

怎么实现类似于新浪点击@字体跳转,点击别的字体触发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,请各位大仙帮帮忙

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 2023-09-27 11:14
    关注

    该回复引自免费微信小程序-皆我百晓生:


    将以下内容重新排版发我:

    实现类似新浪微博点击@或者##跳转,但点击其他文字触发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

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题