您的位置:首页 > 其它

实现微博@@@

2015-08-21 20:55 387 查看
首先来看看新浪微博client界面如下图所示:



每转发一次都会添加一个@xxx,而点击@xxx则进入该用户具体资料界面,点击其它地方则进入的是微博正文,这个怎么实现呢,仅仅用TextView行吗?答案肯定是不行的!

先分析下它这个过程是怎么实现的,个人认为,当公布一条微博后,这条微博记录所相应的服务端的表中,会实用户个人信息,以及转发时的评论内容即

这一部分(这一部分内容事实上能够是一个字符串),还应有一个被转发人列表能够是json格式的字段(包括被转发人的id和昵称),当下一个用户转发这条微博时。会获取这个被转发人列表字段,转发成功后会将自己的id及昵称保存在这个字段中并传给server。而client在显示被转发的微博时,除了获取到转发评论内容,还会获取到这个被转发人列表字段中包括的转发人id及昵称,然后通过特殊方法,将转发评论内容中的@XXX根据被转发人列表转换为可点击。

网上也有不少方法实现,但本人认为不够全面。因此写下这篇文章及demo,供刚開始学习的人学习。水平有限。不足之处还望各位见谅。

一下是本人demo执行效果图:









下面是主程序中的onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

LinearLayout ll=(LinearLayout) findViewById(R.id.ll);
ll.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Toast.makeText(MainActivity.this, "点击了LinearLayout", Toast.LENGTH_SHORT).show();
}
});

tv = (TextViewFixTouchConsume) this.findViewById(R.id.myTextView);
List<String> textList=new ArrayList<String>();
textList.add("张三");
textList.add("李四");
textList.add("王五");
CharSequence str=replace("@张三:哈哈哈啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈//@李四:哈哈哈啊哈哈哈哈哈哈哈哈哈哈阿斯顿发生地方哈哈哈//@王五:你好啊哈哈哦啊好好",textList);
tv.setText(str);
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
当中TextViewFixTouchConsume为重写的TextView,textList事实上就是上面所讲到的被转发人列表,通过从服务端获取的数据解析后一一加入进list,然后在replace方法中会运行一个方法:

public  String getLinkString(String text, List<String> textList) {
for(int i=0; i<textList.size();i++){
text=text.replace("@" + textList.get(i), "<a href='" + textList.get(i) + "'>" + "@" + textList.get(i) + "</a>");
}
return text;
}
即将转发评论内容中的全部@xxx依据获取的被转发人列表中的昵称替换为<a href=“xxx”>@xxx</a>,之后通过Html.fromHtml将其格式化,再通过下面操作:

SpannableStringBuilder builder = new SpannableStringBuilder(text);
if (text instanceof Spannable) {
int end = text.length();
// 事实上就是得到sp1
Spannable sp = (Spannable) text;
// 得到当中全部的keyword的数组
URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
// 清楚掉全部的keyword标志
builder.clearSpans();
for (URLSpan url : urls) {
// 将keyword数组中的文字加入到新生成的style中去
MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
builder.setSpan(myURLSpan, sp.getSpanStart(url),
sp.getSpanEnd(url),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return builder;


即达到效果,当中的MyURLSpan继承自ClickableSpan,当中重写了onClick点击事件:

public void onClick(View widget) {
//这里面可实现界面跳转等操作
String nickName = mUrl.trim().substring(0);
Toast.makeText(MainActivity.this, nickName, Toast.LENGTH_SHORT).show();
}


源代码下载地址:http://download.csdn.net/detail/baiyuliang2013/7942089
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: