仿QQ控件,朋友圈
来源:互联网 发布:js .index 编辑:程序博客网 时间:2024/05/01 09:12
仿QQ空间列表显示,只要原理是自定义一个控件继承ClickableSpan,在Adapter里面动态添加内容,注释在代码里已经写的很清楚了
遗留了一个问题,希望有人看到解决了也分享一下解决办法:
就是人名和整个TextView的点击冲突,点人名两个点击事件都响应。。。。
代码下载地址:http://download.csdn.net/detail/qq55214/9313721
Activity:
public class MyActivity extends Activity { /** * Called when the activity is first created. */ private ListView listView; private MyAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listView = (ListView) findViewById(R.id.my_list); mAdapter = new MyAdapter(this); listView.setAdapter(mAdapter); // TODO ListView里面有ClickableSpan的时候会影响listview的点击事件 // TODO 需要在adapter的布局上添加 android:descendantFocusability="blocksDescendants" 设置属性 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Toast.makeText(MyActivity.this,"呵呵呵",Toast.LENGTH_SHORT).show(); } }); listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { Toast.makeText(MyActivity.this,"呵ddd",Toast.LENGTH_SHORT).show(); return true; } }); }}
public class MyAdapter extends BaseAdapter { private Context mContext; private String name1 = "叶良辰"; private String name2 = "赵日天"; public MyAdapter(Context mContext) { this.mContext = mContext; } @Override public int getCount() { return 6; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder; if (view == null){ holder = new ViewHolder(); view = LayoutInflater.from(mContext).inflate(R.layout.list_item_layout,null); holder.mLlPrsise = (LinearLayout) view.findViewById(R.id.ll_praise); holder.mLlReply = (LinearLayout) view.findViewById(R.id.ll_reply); view.setTag(holder); }else{ holder = (ViewHolder) view.getTag(); } // TODO 点赞得人 // TODO 这里可以用for循环动态添加,这就就添加了两个人 holder.mLlPrsise.removeAllViews(); ImageView praiseIcon = new ImageView(mContext); praiseIcon.setPadding(0, 0, 8, 0); praiseIcon.setImageDrawable(mContext.getResources().getDrawable(R.drawable.praise)); holder.mLlPrsise.addView(praiseIcon); final TextView praise = new TextView(mContext); praise.setMovementMethod(LinkMovementMethod.getInstance()); praise.setTextColor(mContext.getResources().getColor( R.color.comment_name)); praise.setTextSize(14); // 设置间距 praise.setPadding(2, 0, 2, 0); SpannableString user = new SpannableString(name1 + "、");//回复人的名字 TextViewSpan clickableSpan1 = new TextViewSpan(name1 + "、", mContext, 0, 0); clickableSpan1.setInfo(name1); user.setSpan(clickableSpan1, 0, name1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); praise.setText(user); holder.mLlPrsise.addView(praise); final TextView praise2 = new TextView(mContext); praise2.setMovementMethod(LinkMovementMethod.getInstance()); praise2.setTextColor(mContext.getResources().getColor( R.color.comment_name)); praise2.setTextSize(14); praise2.setPadding(2, 0, 2, 0); SpannableString user2 = new SpannableString(name2);//回复人的名字 TextViewSpan clickableSpan2 = new TextViewSpan(name2, mContext, 0, 0); clickableSpan2.setInfo(name2); user2.setSpan(clickableSpan2, 0, name2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); praise2.setText(user2); holder.mLlPrsise.addView(praise2); TextView count = new TextView(mContext); count.setTextColor(mContext.getResources().getColor( R.color.comment_bg)); count.setTextSize(14); count.setPadding(2, 0, 2, 0); count.setText("2人觉得很赞"); holder.mLlPrsise.addView(count); // TODO 评论内容 holder.mLlReply.removeAllViews(); TextView comment = new TextView(mContext); comment.setMovementMethod(LinkMovementMethod.getInstance()); comment.setTextColor(mContext.getResources().getColor( R.color.comment_bg)); comment.setTextSize(14); SpannableString commentTo = new SpannableString(name1); TextViewSpan clickName = new TextViewSpan(name1, mContext, 0,0); commentTo.setSpan(clickName,0,commentTo.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); // TODO 处理人名的点击事件,需要什么参数传递过去一个对象(这里只传了了一个字符串) clickName.setInfo(name1); comment.setText(commentTo); comment.append(":在下叶良辰"); holder.mLlReply.addView(comment); TextView comment2 = new TextView(mContext); comment2.setMovementMethod(LinkMovementMethod.getInstance()); comment2.setTextColor(mContext.getResources().getColor( R.color.comment_bg)); comment2.setTextSize(14); SpannableString commentTo2 = new SpannableString(name2); TextViewSpan clickName2 = new TextViewSpan(name2, mContext, 0,0); commentTo2.setSpan(clickName2,0,commentTo2.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); clickName2.setInfo(name2); comment2.setText(commentTo2); comment2.append("回复"); comment2.append(commentTo); comment2.append(":我赵日天第一个表示不服。。。"); holder.mLlReply.addView(comment2); // TODO 设置textview的点击颜色和点击事件 comment2.setBackgroundResource(R.drawable.comment_bg); comment2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(mContext,"回复谁谁谁",Toast.LENGTH_SHORT).show(); } }); return view; } class ViewHolder{ LinearLayout mLlPrsise; LinearLayout mLlReply; }}
自定义控件:
public class TextViewSpan<T> extends ClickableSpan {private String clickString;private Context mContext;private int selectClick;private T votePerson;private int mColor;/** * * @param clickString 点击的内容 * @param context * @param selectClick 点击事件分类 * @param mColor 字体的颜色选择 */public TextViewSpan(String clickString, Context context, int selectClick, int mColor) {this.clickString = clickString;this.mContext=context;this.selectClick=selectClick;this.mColor = mColor;}/** * 设置点赞人的信息 * @param t */public void setInfo(T t){votePerson = t;}@Overridepublic void updateDrawState(TextPaint ds) {if (mColor == 1 ){ds.setColor(mContext.getResources().getColor(R.color.event_reg_color_1));} else if (mColor == 2){ds.setColor(mContext.getResources().getColor(R.color.event_reg_color_2));} else if (mColor == 3){ds.setColor(mContext.getResources().getColor(R.color.event_reg_color_3));}else{ds.setColor(mContext.getResources().getColor(R.color.comment_name));}ds.setUnderlineText(false); // 去掉下划线}@Overridepublic void onClick(View widget) {switch (selectClick) {case 0://Toast.makeText(mContext,votePerson.toString(),Toast.LENGTH_SHORT).show();break;case 1:/*Map<String,String> reply = (Map<String,String>)votePerson;Toast.makeText(mContext, reply.get(Constants.TALK_REPLY_NAME),Toast.LENGTH_SHORT).show();*/break;default:break;}}}
0 0
- 仿QQ控件,朋友圈
- android仿qq空间、微信朋友圈图片展示
- 仿QQ控件右上角按钮
- 仿QQ歌词弹幕控件
- c#仿qq好友列表控件
- 仿QQ的导航dll控件开发
- MFC仿QQ好友列表控件
- 自定义控件--仿QQ表情面板
- 【Qt】仿QQ表情选择控件
- 仿QQ控件图片下拉放大效果
- Android 自定义日期控件 (仿QQ,IOS7)
- 仿QQ slidingmenu 自定义属性 自定义控件
- Android 自定义日期控件 (仿QQ,IOS7)
- 自定义控件之DragLayout仿QQ界面
- 仿QQ空间头部下拉放大控件
- 仿QQ空间、微信朋友圈点击评论弹出输入框
- 仿朋友圈收起,全文
- 仿朋友圈上传图片
- 字符串拷贝的一系列问题
- 我的第一篇博客
- C#把时间秒数转化成时间格式字符串00:00:00
- SHELL
- ActivityManager 获取系统进程信息
- 仿QQ控件,朋友圈
- HDU 4336 Card Collector [概率DP]
- Qt从零开始制作串口调试助手-(第十二章、串口数据发送)-Creator_Ly
- 博客地址迁移
- PackageManager 获取系统安装包信息
- Servlet原理
- java网络编程
- 情有独钟
- 【Java】Java之经典循环小例子