PublicMessageAdapter.java 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181
  1. package com.sk.weichat.adapter;
  2. import android.app.Activity;
  3. import android.app.AlertDialog;
  4. import android.app.ProgressDialog;
  5. import android.content.Context;
  6. import android.content.DialogInterface;
  7. import android.content.Intent;
  8. import android.text.SpannableStringBuilder;
  9. import android.text.TextUtils;
  10. import android.util.Log;
  11. import android.view.LayoutInflater;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.widget.AdapterView;
  15. import android.widget.BaseAdapter;
  16. import android.widget.FrameLayout;
  17. import android.widget.ImageView;
  18. import android.widget.ListView;
  19. import android.widget.TextView;
  20. import com.android.volley.Response.ErrorListener;
  21. import com.android.volley.VolleyError;
  22. import com.nostra13.universalimageloader.core.ImageLoader;
  23. import com.sk.weichat.AppConstant;
  24. import com.sk.weichat.MyApplication;
  25. import com.sk.weichat.R;
  26. import com.sk.weichat.audio.AudioPalyer;
  27. import com.sk.weichat.bean.Friend;
  28. import com.sk.weichat.bean.circle.Comment;
  29. import com.sk.weichat.bean.circle.Praise;
  30. import com.sk.weichat.bean.circle.PublicMessage;
  31. import com.sk.weichat.bean.circle.PublicMessage.Body;
  32. import com.sk.weichat.bean.circle.PublicMessage.Resource;
  33. import com.sk.weichat.db.dao.CircleMessageDao;
  34. import com.sk.weichat.db.dao.FriendDao;
  35. import com.sk.weichat.helper.AvatarHelper;
  36. import com.sk.weichat.ui.MainActivity;
  37. import com.sk.weichat.ui.base.BaseActivity;
  38. import com.sk.weichat.ui.circle.BusinessCircleActivity;
  39. import com.sk.weichat.ui.circle.BusinessCircleActivity.ListenerAudio;
  40. import com.sk.weichat.ui.circle.BusinessCircleFragment;
  41. import com.sk.weichat.ui.circle.BusinessCircleFragment.ListenerAudioFragment;
  42. import com.sk.weichat.ui.circle.PMsgDetailActivity;
  43. import com.sk.weichat.ui.circle.showCEView;
  44. import com.sk.weichat.ui.tool.MultiImagePreviewActivity;
  45. import com.sk.weichat.ui.tool.SingleImagePreviewActivity;
  46. import com.sk.weichat.util.HtmlUtils;
  47. import com.sk.weichat.util.LinkMovementClickMethod;
  48. import com.sk.weichat.util.ProgressDialogUtil;
  49. import com.sk.weichat.util.StringUtils;
  50. import com.sk.weichat.util.SystemUtil;
  51. import com.sk.weichat.util.TimeUtils;
  52. import com.sk.weichat.util.ToastUtil;
  53. import com.sk.weichat.view.MyGridView;
  54. import com.sk.weichat.view.OperationMorePopWindow;
  55. import com.sk.weichat.volley.ObjectResult;
  56. import com.sk.weichat.volley.Result;
  57. import com.sk.weichat.volley.StringJsonObjectRequest;
  58. import java.util.ArrayList;
  59. import java.util.HashMap;
  60. import java.util.List;
  61. import java.util.Map;
  62. /**
  63. * @项目名称: SkWeiChat-Baidu
  64. * @包名: com.sk.weichat.adapter
  65. * @作者:王阳
  66. * @创建时间: 2015年10月13日 下午5:21:17
  67. * @描述: 我的空间(商务圈)公共消息的接口
  68. * @SVN版本号: $Rev$
  69. * @修改人: $Author$
  70. * @修改时间: $Date$
  71. * @修改的内容: 增加一个接口在界面不可见时让音频停止
  72. */
  73. public class PublicMessageAdapter extends BaseAdapter implements ListenerAudio, ListenerAudioFragment {
  74. private Context mContext;
  75. private List<PublicMessage> mMessages;
  76. private LayoutInflater mInflater;
  77. private String mLoginUserId;
  78. private String mLoginNickName;
  79. private ProgressDialog mProgressDialog;
  80. // 播放音频的记录
  81. private ViewHolder mVoicePlayViewHolder;// 当前正在播放的VocieViewHolder
  82. private AudioPalyer mAudioPalyer;
  83. private String mVoicePlayId = null;
  84. private Map<String, String> mShowNameMaps;
  85. private CommentAdapter mAdapter;
  86. public void reset() {
  87. if (mAudioPalyer != null) {
  88. mAudioPalyer.stop();
  89. }
  90. }
  91. public PublicMessageAdapter(Context context, List<PublicMessage> messages) {
  92. mContext = context;
  93. mMessages = messages;
  94. mInflater = LayoutInflater.from(mContext);
  95. mLoginUserId = MyApplication.getInstance().mLoginUser.getUserId();
  96. mLoginNickName = MyApplication.getInstance().mLoginUser.getNickName();
  97. mShowNameMaps = new HashMap<String, String>();
  98. mProgressDialog = ProgressDialogUtil.init(mContext, null, mContext.getString(R.string.please_wait));
  99. mAudioPalyer = new AudioPalyer();
  100. mAudioPalyer.setAudioPlayListener(new AudioPalyer.AudioPlayListener() {
  101. @Override
  102. public void onSeekComplete() {
  103. }
  104. @Override
  105. public void onPrepared() {
  106. }
  107. @Override
  108. public void onError() {
  109. mVoicePlayId = null;
  110. if (mVoicePlayViewHolder != null) {
  111. updateVoiceViewHolderIconStatus(false, mVoicePlayViewHolder);
  112. }
  113. mVoicePlayViewHolder = null;
  114. }
  115. @Override
  116. public void onCompletion() {
  117. mVoicePlayId = null;
  118. if (mVoicePlayViewHolder != null) {
  119. updateVoiceViewHolderIconStatus(false, mVoicePlayViewHolder);
  120. }
  121. mVoicePlayViewHolder = null;
  122. }
  123. @Override
  124. public void onBufferingUpdate(int percent) {
  125. }
  126. @Override
  127. public void onPreparing() {
  128. }
  129. });
  130. }
  131. @Override
  132. public int getCount() {
  133. return mMessages.size();
  134. }
  135. @Override
  136. public Object getItem(int position) {
  137. return position;
  138. }
  139. @Override
  140. public long getItemId(int position) {
  141. return position;
  142. }
  143. @Override
  144. public int getViewTypeCount() {
  145. return 10;
  146. }
  147. private static final int VIEW_TYPE_NORMAL_TEXT = 0;
  148. private static final int VIEW_TYPE_FW_TEXT = 1;
  149. private static final int VIEW_TYPE_NORMAL_SINGLE_IMAGE = 2;
  150. private static final int VIEW_TYPE_FW_SINGLE_IMAGE = 3;
  151. private static final int VIEW_TYPE_NORMAL_MULTI_IMAGE = 4;
  152. private static final int VIEW_TYPE_FW_MULTI_IMAGE = 5;
  153. private static final int VIEW_TYPE_NORMAL_VOICE = 6;
  154. private static final int VIEW_TYPE_FW_VOICE = 7;
  155. private static final int VIEW_TYPE_NORMAL_VIDEO = 8;
  156. private static final int VIEW_TYPE_FW_VIDEO = 9;
  157. /**
  158. * @see PublicMessage#getType() <br/>
  159. * 1=文字消息;2=图文消息;3=语音消息; 4=视频消息;5、转载<br/>
  160. * 分的视图类型有: <br/>
  161. * {@link #VIEW_TYPE_NORMAL_TEXT}0、普通文字消息视图<br/>
  162. * {@link #VIEW_TYPE_FW_TEXT} 1、转载文字消息视图 <br/>
  163. * {@link #VIEW_TYPE_NORMAL_SINGLE_IMAGE} 2、普通单张图片的视图<br/>
  164. * {@link #VIEW_TYPE_FW_SINGLE_IMAGE} 3、转载单张图片的视图<br/>
  165. * {@link #VIEW_TYPE_NORMAL_MULTI_IMAGE}4、普通多张图片的视图<br/>
  166. * {@link #VIEW_TYPE_FW_MULTI_IMAGE} 5、转载多张图片的视图<br/>
  167. * {@link #VIEW_TYPE_NORMAL_VOICE} 6、普通音频视图<br/>
  168. * {@link #VIEW_TYPE_FW_VOICE} 7、转载音频视图<br/>
  169. * {@link #VIEW_TYPE_NORMAL_VIDEO}8、普通视频视图<br/>
  170. * {@link #VIEW_TYPE_FW_VIDEO} 9、转载视频视图<br/>
  171. */
  172. @Override
  173. public int getItemViewType(int position) {
  174. PublicMessage message = mMessages.get(position);
  175. boolean fromSelf = message.getSource() == PublicMessage.SOURCE_SELF;
  176. Body body = message.getBody();
  177. if (body == null) {// 如果为空,那么可能是数据错误,直接返回一个普通的文本视图
  178. return VIEW_TYPE_NORMAL_TEXT;
  179. }
  180. if (body.getType() == PublicMessage.TYPE_TEXT) {// 文本视图
  181. if (fromSelf)
  182. return VIEW_TYPE_NORMAL_TEXT;
  183. else
  184. return VIEW_TYPE_FW_TEXT;
  185. } else if (body.getType() == PublicMessage.TYPE_IMG) {
  186. if (body.getImages() == null || body.getImages().size() <= 1) {// 普通的单张图片的视图
  187. if (fromSelf)
  188. return VIEW_TYPE_NORMAL_SINGLE_IMAGE;
  189. else
  190. return VIEW_TYPE_FW_SINGLE_IMAGE;
  191. } else {// 普通的多张图片视图
  192. if (fromSelf)
  193. return VIEW_TYPE_NORMAL_MULTI_IMAGE;
  194. else
  195. return VIEW_TYPE_FW_MULTI_IMAGE;
  196. }
  197. } else if (body.getType() == PublicMessage.TYPE_VOICE) {// 普通音频
  198. if (fromSelf)
  199. return VIEW_TYPE_NORMAL_VOICE;
  200. else
  201. return VIEW_TYPE_FW_VOICE;
  202. } else if (body.getType() == PublicMessage.TYPE_VIDEO) {// 普通视频
  203. if (fromSelf)
  204. return VIEW_TYPE_NORMAL_VIDEO;
  205. else
  206. return VIEW_TYPE_FW_VIDEO;
  207. } else {// 其他,数据错误
  208. return VIEW_TYPE_NORMAL_TEXT;
  209. }
  210. }
  211. @Override
  212. public View getView(final int position, View convertView, ViewGroup parent) {
  213. int viewType = getItemViewType(position);
  214. ViewHolder viewHolder = null;
  215. if (convertView == null || ((Integer) convertView.getTag(R.id.tag_key_list_item_type)) != viewType) {
  216. convertView = mInflater.inflate(R.layout.p_msg_item_main_body, null);
  217. View innerView = null;
  218. if (viewType == VIEW_TYPE_NORMAL_TEXT) {
  219. viewHolder = new NormalTextHolder();
  220. } else if (viewType == VIEW_TYPE_FW_TEXT) {
  221. FwTextHolder holder = new FwTextHolder();
  222. innerView = mInflater.inflate(R.layout.p_msg_item_fw_text, null);
  223. holder.text_tv = (TextView) innerView.findViewById(R.id.text_tv);
  224. viewHolder = holder;
  225. } else if (viewType == VIEW_TYPE_NORMAL_SINGLE_IMAGE) {
  226. NormalSingleImageHolder holder = new NormalSingleImageHolder();
  227. innerView = mInflater.inflate(R.layout.p_msg_item_normal_single_img, null);
  228. holder.image_view = (ImageView) innerView.findViewById(R.id.image_view);
  229. viewHolder = holder;
  230. } else if (viewType == VIEW_TYPE_FW_SINGLE_IMAGE) {
  231. FwSingleImageHolder holder = new FwSingleImageHolder();
  232. innerView = mInflater.inflate(R.layout.p_msg_item_fw_single_img, null);
  233. holder.text_tv = (TextView) innerView.findViewById(R.id.text_tv);
  234. holder.image_view = (ImageView) innerView.findViewById(R.id.image_view);
  235. viewHolder = holder;
  236. } else if (viewType == VIEW_TYPE_NORMAL_MULTI_IMAGE) {
  237. NormalMultiImageHolder holder = new NormalMultiImageHolder();
  238. innerView = mInflater.inflate(R.layout.p_msg_item_normal_multi_img, null);
  239. holder.grid_view = (MyGridView) innerView.findViewById(R.id.grid_view);
  240. viewHolder = holder;
  241. } else if (viewType == VIEW_TYPE_FW_MULTI_IMAGE) {
  242. FwMultiImageHolder holder = new FwMultiImageHolder();
  243. innerView = mInflater.inflate(R.layout.p_msg_item_fw_multi_img, null);
  244. holder.text_tv = (TextView) innerView.findViewById(R.id.text_tv);
  245. holder.grid_view = (MyGridView) innerView.findViewById(R.id.grid_view);
  246. viewHolder = holder;
  247. } else if (viewType == VIEW_TYPE_NORMAL_VOICE) {
  248. NormalVoiceHolder holder = new NormalVoiceHolder();
  249. innerView = mInflater.inflate(R.layout.p_msg_item_normal_voice, null);
  250. holder.img_view = (ImageView) innerView.findViewById(R.id.img_view);
  251. holder.voice_action_img = (ImageView) innerView.findViewById(R.id.voice_action_img);
  252. holder.voice_desc_tv = (TextView) innerView.findViewById(R.id.voice_desc_tv);
  253. viewHolder = holder;
  254. } else if (viewType == VIEW_TYPE_FW_VOICE) {
  255. FwVoiceHolder holder = new FwVoiceHolder();
  256. innerView = mInflater.inflate(R.layout.p_msg_item_fw_voice, null);
  257. holder.text_tv = (TextView) innerView.findViewById(R.id.text_tv);
  258. holder.img_view = (ImageView) innerView.findViewById(R.id.img_view);
  259. holder.voice_action_img = (ImageView) innerView.findViewById(R.id.voice_action_img);
  260. holder.voice_desc_tv = (TextView) innerView.findViewById(R.id.voice_desc_tv);
  261. viewHolder = holder;
  262. } else if (viewType == VIEW_TYPE_NORMAL_VIDEO) {
  263. NormalVideoHolder holder = new NormalVideoHolder();
  264. innerView = mInflater.inflate(R.layout.p_msg_item_normal_video, null);
  265. holder.video_thumb_img = (ImageView) innerView.findViewById(R.id.video_thumb_img);
  266. holder.video_desc_tv = (TextView) innerView.findViewById(R.id.video_desc_tv);
  267. viewHolder = holder;
  268. } else if (viewType == VIEW_TYPE_FW_VIDEO) {
  269. FwVideoHolder holder = new FwVideoHolder();
  270. innerView = mInflater.inflate(R.layout.p_msg_item_fw_video, null);
  271. holder.text_tv = (TextView) innerView.findViewById(R.id.text_tv);
  272. holder.video_thumb_img = (ImageView) innerView.findViewById(R.id.video_thumb_img);
  273. holder.video_desc_tv = (TextView) innerView.findViewById(R.id.video_desc_tv);
  274. viewHolder = holder;
  275. }
  276. viewHolder.avatar_img = (ImageView) convertView.findViewById(R.id.avatar_img);
  277. viewHolder.nick_name_tv = (TextView) convertView.findViewById(R.id.nick_name_tv);
  278. viewHolder.time_tv = (TextView) convertView.findViewById(R.id.time_tv);
  279. viewHolder.body_tv = (TextView) convertView.findViewById(R.id.body_tv);
  280. viewHolder.content_fl = (FrameLayout) convertView.findViewById(R.id.content_fl);
  281. viewHolder.delete_tv = (TextView) convertView.findViewById(R.id.delete_tv);
  282. viewHolder.operation_more_img = (ImageView) convertView.findViewById(R.id.operation_more_img);
  283. viewHolder.multi_praise_tv = (TextView) convertView.findViewById(R.id.multi_praise_tv);
  284. viewHolder.command_listView = (ListView) convertView.findViewById(R.id.command_listView);
  285. viewHolder.viewLine = convertView.findViewById(R.id.line);
  286. if (innerView != null) {
  287. viewHolder.content_fl.addView(innerView);
  288. }
  289. convertView.setTag(R.id.tag_key_list_item_type, viewType);
  290. convertView.setTag(R.id.tag_key_list_item_view, viewHolder);
  291. } else {
  292. viewHolder = (ViewHolder) convertView.getTag(R.id.tag_key_list_item_view);
  293. }
  294. // if (position % 2 == 0) {
  295. // convertView.setBackgroundColor(mContext.getResources().getColor(R.color.item_color1));
  296. // } else {
  297. // convertView.setBackgroundColor(mContext.getResources().getColor(R.color.item_color2));
  298. // }
  299. final ViewHolder finalHolder = viewHolder;// 和ViewHolder一样的,只不过用作匿名内部类里面调用需要final
  300. // set data
  301. final PublicMessage message = mMessages.get(position);
  302. if (message == null) {
  303. return convertView;
  304. }
  305. // 设备头像
  306. AvatarHelper.getInstance().displayAvatar(message.getUserId(), viewHolder.avatar_img, true);
  307. /* 设置昵称 */
  308. SpannableStringBuilder nickNamebuilder = new SpannableStringBuilder();
  309. final String userId = message.getUserId();
  310. String showName = getShowName(userId, message.getNickName());
  311. UserClickableSpan.setClickableSpan(mContext, nickNamebuilder, showName, message.getUserId());
  312. viewHolder.nick_name_tv.setText(nickNamebuilder);
  313. viewHolder.nick_name_tv.setLinksClickable(true);
  314. viewHolder.nick_name_tv.setMovementMethod(LinkMovementClickMethod.getInstance());
  315. // 设置头像的点击事件
  316. viewHolder.avatar_img.setOnClickListener(new View.OnClickListener() {
  317. @Override
  318. public void onClick(View v) {
  319. if (mContext instanceof BusinessCircleActivity) {//防止重复进入
  320. return;
  321. }
  322. Intent intent = new Intent(mContext, BusinessCircleActivity.class);
  323. intent.putExtra(AppConstant.EXTRA_CIRCLE_TYPE, AppConstant.CIRCLE_TYPE_PERSONAL_SPACE);
  324. intent.putExtra(AppConstant.EXTRA_USER_ID, message.getUserId());
  325. intent.putExtra(AppConstant.EXTRA_NICK_NAME, mShowNameMaps.get(userId));
  326. mContext.startActivity(intent);
  327. }
  328. });
  329. // 获取消息本身的内容
  330. Body body = message.getBody();
  331. if (body == null) {
  332. return convertView;
  333. }
  334. // 是否是转载的
  335. boolean isForwarding = message.getSource() == PublicMessage.SOURCE_FORWARDING;
  336. // 设置body_tv
  337. if (TextUtils.isEmpty(body.getText())) {
  338. viewHolder.body_tv.setVisibility(View.GONE);
  339. } else {
  340. viewHolder.body_tv.setVisibility(View.VISIBLE);
  341. viewHolder.body_tv.setText(body.getText());
  342. }
  343. viewHolder.body_tv.setOnLongClickListener(new View.OnLongClickListener() {
  344. @Override
  345. public boolean onLongClick(View v) {
  346. showBodyTextLongClickDialog(finalHolder.body_tv.getText().toString());
  347. return true;
  348. }
  349. });
  350. // 设置发布时间
  351. viewHolder.time_tv.setText(TimeUtils.getFriendlyTimeDesc(mContext, (int) message.getTime()));
  352. // 设置删除按钮
  353. if (userId.equals(mLoginUserId)) {// 是我发的消息
  354. viewHolder.delete_tv.setVisibility(View.VISIBLE);
  355. viewHolder.delete_tv.setOnClickListener(new View.OnClickListener() {
  356. @Override
  357. public void onClick(View v) {
  358. showDeleteMsgDialog(position);
  359. }
  360. });
  361. } else {
  362. viewHolder.delete_tv.setVisibility(View.GONE);
  363. viewHolder.delete_tv.setOnClickListener(null);
  364. }
  365. viewHolder.operation_more_img.setOnClickListener(new View.OnClickListener() {
  366. @Override
  367. public void onClick(View v) {
  368. showOperationMorePopWindow(finalHolder.operation_more_img, position);
  369. }
  370. });
  371. /* 显示多少人赞过 */
  372. List<Praise> praises = message.getPraises();
  373. if (praises != null && praises.size() > 0) {
  374. viewHolder.multi_praise_tv.setVisibility(View.VISIBLE);
  375. SpannableStringBuilder builder = new SpannableStringBuilder();
  376. for (int i = 0; i < praises.size(); i++) {
  377. String praiseName = getShowName(praises.get(i).getUserId(), praises.get(i).getNickName());
  378. UserClickableSpan.setClickableSpan(mContext, builder, praiseName, praises.get(i).getUserId());
  379. if (i < praises.size() - 1)
  380. builder.append("、");
  381. }
  382. if (message.getPraise() > praises.size()) {
  383. builder.append("...");
  384. }
  385. viewHolder.multi_praise_tv.setText(builder);
  386. if (viewHolder.multi_praise_tv.getLineCount() > 0) {
  387. ViewGroup.LayoutParams p = viewHolder.multi_praise_tv.getLayoutParams();
  388. p.height = viewHolder.multi_praise_tv.getHeight() * viewHolder.multi_praise_tv.getLineCount();
  389. viewHolder.multi_praise_tv.setLayoutParams(p);
  390. }
  391. Log.i("gongpengming", viewHolder.multi_praise_tv.getLineCount() + "行数");
  392. // if (viewHolder.multi_praise_tv.getLineCount()>1)
  393. } else {
  394. viewHolder.multi_praise_tv.setVisibility(View.GONE);
  395. viewHolder.multi_praise_tv.setText("");
  396. }
  397. viewHolder.multi_praise_tv.setLinksClickable(true);
  398. viewHolder.multi_praise_tv.setMovementMethod(LinkMovementClickMethod.getInstance());
  399. /* 设置回复 */
  400. final List<Comment> comments = message.getComments();
  401. if ((praises != null && praises.size() > 0) || (comments != null && comments.size() > 0)) {
  402. viewHolder.viewLine.setVisibility(View.GONE);
  403. } else {
  404. viewHolder.viewLine.setVisibility(View.GONE);
  405. }
  406. if (comments != null && comments.size() > 0) {
  407. viewHolder.command_listView.setVisibility(View.VISIBLE);
  408. mAdapter = new CommentAdapter(position, comments);
  409. viewHolder.command_listView.setAdapter(mAdapter);
  410. } else {
  411. viewHolder.command_listView.setVisibility(View.GONE);
  412. viewHolder.command_listView.setAdapter(null);
  413. }
  414. // //////////////////上面是公用的部分,下面是每个Type不同的部分/////////////////////////////////////////
  415. // 转载的消息会有一个转载人和text
  416. SpannableStringBuilder forwardingBuilder = null;
  417. if (isForwarding) {// 转载的那个人和说的话
  418. forwardingBuilder = new SpannableStringBuilder();
  419. String forwardName = getShowName(message.getFowardUserId(), message.getFowardNickname());
  420. UserClickableSpan.setClickableSpan(mContext, forwardingBuilder, forwardName, message.getFowardUserId());
  421. if (!TextUtils.isEmpty(message.getFowardText())) {
  422. forwardingBuilder.append(" : ");
  423. forwardingBuilder.append(message.getFowardText());
  424. }
  425. }
  426. if (viewType == VIEW_TYPE_NORMAL_TEXT) {
  427. viewHolder.content_fl.setVisibility(View.GONE);// 因为有个MarginTop
  428. // 5dp,所以没内容的时候隐藏,免得中间间隔有点大
  429. } else if (viewType == VIEW_TYPE_FW_TEXT) {
  430. TextView text_tv = ((FwTextHolder) viewHolder).text_tv;
  431. text_tv.setText(forwardingBuilder != null ? forwardingBuilder : "");
  432. } else if (viewType == VIEW_TYPE_NORMAL_SINGLE_IMAGE) {
  433. ImageView image_view = ((NormalSingleImageHolder) viewHolder).image_view;
  434. String url = message.getFirstImageOriginal();
  435. if (!TextUtils.isEmpty(url)) {
  436. ImageLoader.getInstance().displayImage(url, image_view);
  437. image_view.setOnClickListener(new SingleImageClickListener(url));
  438. } else {
  439. image_view.setImageBitmap(null);
  440. }
  441. } else if (viewType == VIEW_TYPE_FW_SINGLE_IMAGE) {
  442. TextView text_tv = ((FwSingleImageHolder) viewHolder).text_tv;
  443. ImageView image_view = ((FwSingleImageHolder) viewHolder).image_view;
  444. text_tv.setText(forwardingBuilder != null ? forwardingBuilder : "");
  445. String url = message.getFirstImageOriginal();
  446. if (!TextUtils.isEmpty(url)) {
  447. ImageLoader.getInstance().displayImage(url, image_view);
  448. image_view.setOnClickListener(new SingleImageClickListener(url));
  449. } else {
  450. image_view.setImageBitmap(null);
  451. }
  452. } else if (viewType == VIEW_TYPE_NORMAL_MULTI_IMAGE) {
  453. MyGridView grid_view = ((NormalMultiImageHolder) viewHolder).grid_view;
  454. if (body.getImages() != null) {
  455. grid_view.setAdapter(new ImagesInnerGridViewAdapter(mContext, body.getImages()));
  456. grid_view.setOnItemClickListener(new MultipleImagesClickListener(body.getImages()));
  457. } else {
  458. grid_view.setAdapter(null);
  459. }
  460. } else if (viewType == VIEW_TYPE_FW_MULTI_IMAGE) {
  461. TextView text_tv = ((FwMultiImageHolder) viewHolder).text_tv;
  462. MyGridView grid_view = ((FwMultiImageHolder) viewHolder).grid_view;
  463. text_tv.setText(forwardingBuilder != null ? forwardingBuilder : "");
  464. if (body.getImages() != null) {
  465. grid_view.setAdapter(new ImagesInnerGridViewAdapter(mContext, body.getImages()));
  466. grid_view.setOnItemClickListener(new MultipleImagesClickListener(body.getImages()));
  467. } else {
  468. grid_view.setAdapter(null);
  469. }
  470. } else if (viewType == VIEW_TYPE_NORMAL_VOICE) {
  471. final NormalVoiceHolder holder = (NormalVoiceHolder) viewHolder;
  472. if (mVoicePlayId == null || !mVoicePlayId.equals(message.getMessageId())) {// 处于非播放状态
  473. holder.voice_action_img.setImageResource(R.drawable.feed_main_player_play);
  474. } else {
  475. holder.voice_action_img.setImageResource(R.drawable.feed_main_player_pause);
  476. }
  477. holder.voice_action_img.setOnClickListener(new View.OnClickListener() {
  478. @Override
  479. public void onClick(View v) {
  480. play(holder, message);
  481. }
  482. });
  483. String imageUrl = message.getFirstImageOriginal();
  484. if (TextUtils.isEmpty(imageUrl)) {
  485. AvatarHelper.getInstance().displayAvatar(message.getUserId(), holder.img_view, false);
  486. holder.img_view.setOnClickListener(
  487. new SingleImageClickListener(AvatarHelper.getAvatarUrl(message.getUserId(), false)));
  488. } else {
  489. ImageLoader.getInstance().displayImage(imageUrl, holder.img_view);
  490. holder.img_view.setOnClickListener(new SingleImageClickListener(imageUrl));
  491. }
  492. } else if (viewType == VIEW_TYPE_FW_VOICE) {
  493. final FwVoiceHolder holder = (FwVoiceHolder) viewHolder;
  494. holder.text_tv.setText(forwardingBuilder != null ? forwardingBuilder : "");
  495. if (mVoicePlayId == null || !mVoicePlayId.equals(message.getMessageId())) {// 处于非播放状态
  496. holder.voice_action_img.setImageResource(R.drawable.feed_main_player_play);
  497. } else {
  498. holder.voice_action_img.setImageResource(R.drawable.feed_main_player_pause);
  499. }
  500. holder.voice_action_img.setOnClickListener(new View.OnClickListener() {
  501. @Override
  502. public void onClick(View v) {
  503. play(holder, message);
  504. }
  505. });
  506. String imageUrl = message.getFirstImageOriginal();
  507. if (TextUtils.isEmpty(imageUrl)) {
  508. AvatarHelper.getInstance().displayAvatar(message.getUserId(), holder.img_view, false);
  509. holder.img_view.setOnClickListener(
  510. new SingleImageClickListener(AvatarHelper.getAvatarUrl(message.getUserId(), false)));
  511. } else {
  512. ImageLoader.getInstance().displayImage(imageUrl, holder.img_view);
  513. holder.img_view.setOnClickListener(new SingleImageClickListener(imageUrl));
  514. }
  515. } else if (viewType == VIEW_TYPE_NORMAL_VIDEO) {
  516. NormalVideoHolder holder = (NormalVideoHolder) viewHolder;
  517. String imageUrl = message.getFirstImageOriginal();
  518. if (TextUtils.isEmpty(imageUrl)) {
  519. AvatarHelper.getInstance().displayAvatar(message.getUserId(), holder.video_thumb_img, false);
  520. } else {
  521. ImageLoader.getInstance().displayImage(imageUrl, holder.video_thumb_img);
  522. }
  523. // holder.video_desc_tv.setText();
  524. } else if (viewType == VIEW_TYPE_FW_VIDEO) {
  525. FwVideoHolder holder = (FwVideoHolder) viewHolder;
  526. holder.text_tv.setText(forwardingBuilder != null ? forwardingBuilder : "");
  527. String imageUrl = message.getFirstImageOriginal();
  528. if (TextUtils.isEmpty(imageUrl)) {
  529. AvatarHelper.getInstance().displayAvatar(message.getUserId(), holder.video_thumb_img, false);
  530. } else {
  531. ImageLoader.getInstance().displayImage(imageUrl, holder.video_thumb_img);
  532. }
  533. }
  534. return convertView;
  535. }
  536. class ViewHolder {
  537. View viewLine;
  538. ImageView avatar_img;
  539. TextView nick_name_tv;
  540. TextView time_tv;
  541. TextView body_tv;
  542. FrameLayout content_fl;
  543. TextView delete_tv;
  544. ImageView operation_more_img;
  545. TextView multi_praise_tv;
  546. ListView command_listView;
  547. }
  548. /* 普通的Text */
  549. class NormalTextHolder extends ViewHolder {
  550. }
  551. /* 转载的Text */
  552. class FwTextHolder extends ViewHolder {
  553. TextView text_tv;
  554. }
  555. /* 普通的单张图片 */
  556. class NormalSingleImageHolder extends ViewHolder {
  557. ImageView image_view;
  558. }
  559. /* 转载的单张图片 */
  560. class FwSingleImageHolder extends ViewHolder {
  561. TextView text_tv;
  562. ImageView image_view;
  563. }
  564. /* 普通的多张图片 */
  565. class NormalMultiImageHolder extends ViewHolder {
  566. MyGridView grid_view;
  567. }
  568. /* 转载的多张图片 */
  569. class FwMultiImageHolder extends ViewHolder {
  570. TextView text_tv;
  571. MyGridView grid_view;
  572. }
  573. /* 普通的音频 */
  574. class NormalVoiceHolder extends ViewHolder {
  575. ImageView img_view;
  576. ImageView voice_action_img;
  577. TextView voice_desc_tv;
  578. }
  579. /* 转载的音频 */
  580. class FwVoiceHolder extends ViewHolder {
  581. TextView text_tv;
  582. ImageView img_view;
  583. ImageView voice_action_img;
  584. TextView voice_desc_tv;
  585. }
  586. /* 普通的视频 */
  587. class NormalVideoHolder extends ViewHolder {
  588. ImageView video_thumb_img;
  589. TextView video_desc_tv;
  590. }
  591. /* 转载的视频 */
  592. class FwVideoHolder extends ViewHolder {
  593. TextView text_tv;
  594. ImageView video_thumb_img;
  595. TextView video_desc_tv;
  596. }
  597. public class CommentAdapter extends BaseAdapter {
  598. private int messagePosition;
  599. private List<Comment> datas;
  600. public CommentAdapter(int messagePosition, List<Comment> datas) {
  601. this.messagePosition = messagePosition;
  602. this.datas = datas;
  603. }
  604. @Override
  605. public int getCount() {
  606. return datas.size();
  607. }
  608. @Override
  609. public Object getItem(int position) {
  610. return position;
  611. }
  612. @Override
  613. public long getItemId(int position) {
  614. return position;
  615. }
  616. @Override
  617. public View getView(final int position, View convertView, ViewGroup parent) {
  618. ViewHolder holder = null;
  619. if (convertView == null) {
  620. holder = new ViewHolder();
  621. convertView = LayoutInflater.from(mContext).inflate(R.layout.p_msg_comment_list_item, null);
  622. holder.text_view = (TextView) convertView.findViewById(R.id.text_view);
  623. convertView.setTag(holder);
  624. } else {
  625. holder = (ViewHolder) convertView.getTag();
  626. }
  627. final Comment comment = datas.get(position);
  628. SpannableStringBuilder builder = new SpannableStringBuilder();
  629. String showName = getShowName(comment.getUserId(), comment.getNickName());
  630. UserClickableSpan.setClickableSpan(mContext, builder, showName, comment.getUserId());// 设置评论者的ClickSpanned
  631. if (!TextUtils.isEmpty(comment.getToUserId()) && !TextUtils.isEmpty(comment.getToNickname())) {
  632. builder.append(mContext.getString(R.string.replay));
  633. String toShowName = getShowName(comment.getToUserId(), comment.getToNickname());
  634. UserClickableSpan.setClickableSpan(mContext, builder, toShowName, comment.getToUserId());// 设置被评论者的ClickSpanned
  635. }
  636. builder.append(":");
  637. // 设置评论内容
  638. String commentBody = comment.getBody();
  639. if (!TextUtils.isEmpty(commentBody)) {
  640. commentBody = StringUtils.replaceSpecialChar(comment.getBody());
  641. CharSequence charSequence = HtmlUtils.transform200SpanString(commentBody.replaceAll("\n", "\r\n"),
  642. true);
  643. builder.append(charSequence);
  644. }
  645. holder.text_view.setText(builder);
  646. holder.text_view.setLinksClickable(true);
  647. holder.text_view.setMovementMethod(LinkMovementClickMethod.getInstance());
  648. holder.text_view.setOnClickListener(new View.OnClickListener() {
  649. @Override
  650. public void onClick(View v) {
  651. if (comment.getUserId().equals(mLoginUserId)) {// 如果消息是我发的,那么就弹出删除和复制的对话框
  652. showCommentLongClickDialog(messagePosition, position, CommentAdapter.this);
  653. } else {// 弹出回复的框
  654. String toShowName = getShowName(comment.getUserId(), comment.getNickName());
  655. // 懒得写回调的,直接强转,以后如果不适用,可以写个接口回调
  656. if (mContext instanceof BusinessCircleActivity) {
  657. ((BusinessCircleActivity) mContext).showCommentEnterView(messagePosition,
  658. comment.getUserId(), comment.getNickName(), toShowName);
  659. } else {
  660. ((MainActivity) mContext).getBusinessCircleFragment().showCommentEnterView(messagePosition,
  661. comment.getUserId(), comment.getNickName(), toShowName);
  662. }
  663. // show(messagePosition, comment.getUserId(),
  664. // comment.getNickName(),toShowName);
  665. }
  666. }
  667. });
  668. holder.text_view.setOnLongClickListener(new View.OnLongClickListener() {
  669. @Override
  670. public boolean onLongClick(View v) {
  671. showCommentLongClickDialog(messagePosition, position, CommentAdapter.this);
  672. return true;
  673. }
  674. });
  675. return convertView;
  676. }
  677. class ViewHolder {
  678. TextView text_view;
  679. }
  680. }
  681. /*
  682. * 回调接口的编写 暂时没有用上
  683. *
  684. */
  685. public showCEView ceView;
  686. public void setShowCEViewListener(showCEView ceView) {
  687. this.ceView = ceView;
  688. }
  689. public void show(int messagePosition, String toUserId, String toNickname, String toShowName) {
  690. BusinessCircleFragment fra = new BusinessCircleFragment();
  691. // BusinessCircleActivity fra=new BusinessCircleActivity();
  692. setShowCEViewListener(fra);
  693. if (ceView != null) {
  694. ceView.showView(messagePosition, toUserId, toNickname, toShowName);
  695. }
  696. }
  697. private class SingleImageClickListener implements View.OnClickListener {
  698. private String url;
  699. public SingleImageClickListener(String url) {
  700. this.url = url;
  701. }
  702. @Override
  703. public void onClick(View v) {
  704. Intent intent = new Intent(mContext, SingleImagePreviewActivity.class);
  705. intent.putExtra(AppConstant.EXTRA_IMAGE_URI, url);
  706. mContext.startActivity(intent);
  707. }
  708. }
  709. private class MultipleImagesClickListener implements AdapterView.OnItemClickListener {
  710. private List<Resource> images;
  711. public MultipleImagesClickListener(List<Resource> images) {
  712. this.images = images;
  713. }
  714. @Override
  715. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  716. if (images == null || images.size() <= 0) {
  717. return;
  718. }
  719. ArrayList<String> lists = new ArrayList<String>();
  720. for (int i = 0; i < images.size(); i++) {
  721. lists.add(images.get(i).getOriginalUrl());
  722. }
  723. Intent intent = new Intent(mContext, MultiImagePreviewActivity.class);
  724. intent.putExtra(AppConstant.EXTRA_IMAGES, lists);
  725. intent.putExtra(AppConstant.EXTRA_POSITION, position);
  726. intent.putExtra(AppConstant.EXTRA_CHANGE_SELECTED, false);
  727. mContext.startActivity(intent);
  728. }
  729. }
  730. public static String ToDBC(String input) {
  731. char[] c = input.toCharArray();
  732. for (int i = 0; i < c.length; i++) {
  733. if (c[i] == 12288) {
  734. c[i] = (char) 32;
  735. continue;
  736. }
  737. if (c[i] > 65280 && c[i] < 65375)
  738. c[i] = (char) (c[i] - 65248);
  739. }
  740. return new String(c);
  741. }
  742. private String getShowName(String userId, String defaultName) {
  743. String showName = null;
  744. if (!mShowNameMaps.containsKey(userId)) {
  745. if (userId.equals(mLoginUserId)) {
  746. mShowNameMaps.put(userId, mLoginNickName);
  747. } else {
  748. Friend friend = FriendDao.getInstance().getFriend(mLoginUserId, userId);
  749. if (friend != null) {
  750. mShowNameMaps.put(userId, friend.getShowName());
  751. }
  752. }
  753. }
  754. showName = mShowNameMaps.get(userId);
  755. if (TextUtils.isEmpty(showName)) {
  756. showName = defaultName;
  757. mShowNameMaps.put(userId, showName);
  758. }
  759. return showName;
  760. }
  761. /* 操作事件 */
  762. private void showDeleteMsgDialog(final int position) {
  763. new AlertDialog.Builder(mContext).setTitle(R.string.prompt_title).setMessage(R.string.delete_prompt)
  764. .setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() {
  765. @Override
  766. public void onClick(DialogInterface dialog, int which) {
  767. deleteMsg(position);
  768. }
  769. }).setNegativeButton(R.string.cancel, null).create().show();
  770. }
  771. private void deleteMsg(final int position) {
  772. final PublicMessage message = mMessages.get(position);
  773. if (message == null) {
  774. return;
  775. }
  776. HashMap<String, String> params = new HashMap<String, String>();
  777. params.put("access_token", MyApplication.getInstance().mAccessToken);
  778. params.put("messageId", message.getMessageId());
  779. ProgressDialogUtil.show(mProgressDialog);
  780. StringJsonObjectRequest<Void> request = new StringJsonObjectRequest<Void>(
  781. MyApplication.getInstance().getConfig().CIRCLE_MSG_DELETE, new ErrorListener() {
  782. @Override
  783. public void onErrorResponse(VolleyError arg0) {
  784. ProgressDialogUtil.dismiss(mProgressDialog);
  785. ToastUtil.showErrorNet(mContext);
  786. }
  787. }, new StringJsonObjectRequest.Listener<Void>() {
  788. @Override
  789. public void onResponse(ObjectResult<Void> result) {
  790. boolean success = Result.defaultParser(mContext, result, true);
  791. if (success) {
  792. CircleMessageDao.getInstance().deleteMessage(message.getMessageId());// 删除数据库的记录(如果存在的话)
  793. mMessages.remove(position);
  794. notifyDataSetChanged();
  795. }
  796. ProgressDialogUtil.dismiss(mProgressDialog);
  797. }
  798. }, Void.class, params);
  799. ((BaseActivity) mContext).addDefaultRequest(request);
  800. }
  801. private void showBodyTextLongClickDialog(final String text) {
  802. CharSequence[] items = new CharSequence[]{mContext.getString(R.string.copy)};
  803. new AlertDialog.Builder(mContext).setItems(items, new DialogInterface.OnClickListener() {
  804. @Override
  805. public void onClick(DialogInterface dialog, int which) {
  806. switch (which) {
  807. case 0:// 复制文字
  808. SystemUtil.copyText(mContext, text);
  809. break;
  810. }
  811. }
  812. }).setCancelable(true).create().show();
  813. }
  814. private void showCommentLongClickDialog(final int messagePosition, final int commentPosition,
  815. final CommentAdapter adapter) {
  816. if (messagePosition < 0 || messagePosition >= mMessages.size()) {
  817. return;
  818. }
  819. final PublicMessage message = mMessages.get(messagePosition);
  820. if (message == null) {
  821. return;
  822. }
  823. final List<Comment> comments = message.getComments();
  824. if (comments == null) {
  825. return;
  826. }
  827. if (commentPosition < 0 || commentPosition >= comments.size()) {
  828. return;
  829. }
  830. final Comment comment = comments.get(commentPosition);
  831. CharSequence[] items;
  832. if (comment.getUserId().equals(mLoginUserId) || message.getUserId().equals(mLoginUserId)) {// 我的评论,或者我的消息,那么我就可以删除
  833. items = new CharSequence[]{mContext.getString(R.string.copy), mContext.getString(R.string.delete)};
  834. } else {
  835. items = new CharSequence[]{mContext.getString(R.string.copy)};
  836. }
  837. new AlertDialog.Builder(mContext).setItems(items, new DialogInterface.OnClickListener() {
  838. @Override
  839. public void onClick(DialogInterface dialog, int which) {
  840. switch (which) {
  841. case 0:// 复制文字
  842. if (TextUtils.isEmpty(comment.getBody())) {
  843. return;
  844. }
  845. SystemUtil.copyText(mContext, comment.getBody());
  846. break;
  847. case 1:
  848. deleteComment(message.getMessageId(), comment.getCommentId(), comments, commentPosition, adapter);
  849. break;
  850. }
  851. }
  852. }).setCancelable(true).create().show();
  853. }
  854. /**
  855. * 删除一条回复
  856. */
  857. private void deleteComment(String messageId, String commentId, final List<Comment> comments,
  858. final int commentPosition, final CommentAdapter adapter) {
  859. HashMap<String, String> params = new HashMap<String, String>();
  860. params.put("access_token", MyApplication.getInstance().mAccessToken);
  861. params.put("messageId", messageId);
  862. params.put("commentId", commentId);
  863. StringJsonObjectRequest<Void> request = new StringJsonObjectRequest<Void>(
  864. MyApplication.getInstance().getConfig().MSG_COMMENT_DELETE, new ErrorListener() {
  865. @Override
  866. public void onErrorResponse(VolleyError arg0) {
  867. ToastUtil.showErrorNet(mContext);
  868. }
  869. }, new StringJsonObjectRequest.Listener<Void>() {
  870. @Override
  871. public void onResponse(ObjectResult<Void> result) {
  872. boolean success = Result.defaultParser(mContext, result, true);
  873. if (success) {
  874. comments.remove(commentPosition);
  875. adapter.notifyDataSetChanged();
  876. }
  877. }
  878. }, Void.class, params);
  879. ((BaseActivity) mContext).addDefaultRequest(request);
  880. }
  881. /* 点击更多操作弹出的对话框 */
  882. private OperationMorePopWindow mOperationMorePop;
  883. private void showOperationMorePopWindow(View anchowView, final int position) {
  884. if (mOperationMorePop == null) {
  885. mOperationMorePop = new OperationMorePopWindow((Activity) mContext);
  886. mOperationMorePop.setOperationMoreListener(new OperationMorePopWindow.OperationMoreListener() {
  887. @Override
  888. public void onPraise(int messagePosition, boolean isPraise) {
  889. praiseOrCancle(messagePosition, isPraise);
  890. }
  891. @Override
  892. public void onGift(int messagePosition) {
  893. }
  894. @Override
  895. public void onComment(int messagePosition) {
  896. // 懒得写回调的,直接强转,以后如果不适用,可以写个接口回调
  897. if (mContext instanceof BusinessCircleActivity) {
  898. ((BusinessCircleActivity) mContext).showCommentEnterView(messagePosition, null, null, null);
  899. } else {
  900. // 这里当处于的是一个fragment中时,我们让他评论的时候直接跳到详情页去评论
  901. PublicMessage message = mMessages.get(messagePosition);
  902. Intent intent = new Intent(mContext, PMsgDetailActivity.class);
  903. intent.putExtra("public_message", message);
  904. mContext.startActivity(intent);
  905. }
  906. // 这里有问题,所以暂不使用回调接口实现
  907. // show(messagePosition,null, null, null);
  908. }
  909. });
  910. }
  911. PublicMessage message = mMessages.get(position);
  912. if (message == null) {
  913. return;
  914. }
  915. mOperationMorePop.show(anchowView, position, message.getIsPraise() == 1 ? false : true);
  916. }
  917. /**
  918. * 赞或者取消赞
  919. *
  920. * @param
  921. * @param isPraise
  922. */
  923. private void praiseOrCancle(final int position, final boolean isPraise) {
  924. final PublicMessage message = mMessages.get(position);
  925. if (message == null) {
  926. return;
  927. }
  928. HashMap<String, String> params = new HashMap<String, String>();
  929. params.put("access_token", MyApplication.getInstance().mAccessToken);
  930. params.put("messageId", message.getMessageId());
  931. String requestUrl = null;
  932. if (isPraise) {
  933. requestUrl = MyApplication.getInstance().getConfig().MSG_PRAISE_ADD;
  934. } else {
  935. requestUrl = MyApplication.getInstance().getConfig().MSG_PRAISE_DELETE;
  936. }
  937. StringJsonObjectRequest<Void> request = new StringJsonObjectRequest<Void>(requestUrl, new ErrorListener() {
  938. @Override
  939. public void onErrorResponse(VolleyError arg0) {
  940. ToastUtil.showErrorNet(mContext);
  941. }
  942. }, new StringJsonObjectRequest.Listener<Void>() {
  943. @Override
  944. public void onResponse(ObjectResult<Void> result) {
  945. boolean success = Result.defaultParser(mContext, result, true);
  946. if (success) {
  947. message.setIsPraise(isPraise ? 1 : 0);
  948. List<Praise> praises = message.getPraises();
  949. if (praises == null) {
  950. praises = new ArrayList<Praise>();
  951. message.setPraises(praises);
  952. }
  953. int praiseCount = message.getPraise();
  954. if (isPraise) {// 代表我点赞
  955. // 消息实体的改变
  956. Praise praise = new Praise();
  957. praise.setUserId(mLoginUserId);
  958. praise.setNickName(mLoginNickName);
  959. praises.add(0, praise);
  960. praiseCount++;
  961. message.setPraise(praiseCount);
  962. } else {// 取消我的赞
  963. // 消息实体的改变
  964. for (int i = 0; i < praises.size(); i++) {
  965. if (mLoginUserId.equals(praises.get(i).getUserId())) {
  966. praises.remove(i);
  967. praiseCount--;
  968. message.setPraise(praiseCount);
  969. break;
  970. }
  971. }
  972. }
  973. notifyDataSetChanged();
  974. }
  975. }
  976. }, Void.class, params);
  977. ((BaseActivity) mContext).addDefaultRequest(request);
  978. }
  979. /**
  980. * 停止播放声音
  981. */
  982. private void stopVoice() {
  983. Log.d("wang", "stopVoice");
  984. if (mAudioPalyer != null) {
  985. mAudioPalyer.stop();
  986. }
  987. }
  988. private void stopVoiceIDE() {
  989. Log.d("wang", "stopVoiceIDE");
  990. if (mAudioPalyer != null) {
  991. mAudioPalyer.release();
  992. }
  993. }
  994. /********************** 播放声音 ***********************************/
  995. /**
  996. * @param
  997. * @param viewHolder
  998. * @param
  999. */
  1000. private void play(ViewHolder viewHolder, PublicMessage message) {
  1001. String voiceUrl = message.getFirstAudio();
  1002. if (mVoicePlayId == null) {// 没有在播放
  1003. try {
  1004. mAudioPalyer.play(voiceUrl);
  1005. } catch (Exception e) {
  1006. e.printStackTrace();
  1007. }
  1008. mVoicePlayId = message.getMessageId();
  1009. updateVoiceViewHolderIconStatus(true, viewHolder);
  1010. mVoicePlayViewHolder = viewHolder;
  1011. } else {
  1012. if (mVoicePlayId == message.getMessageId()) {
  1013. mAudioPalyer.stop();
  1014. mVoicePlayId = null;
  1015. updateVoiceViewHolderIconStatus(false, viewHolder);
  1016. mVoicePlayViewHolder = null;
  1017. } else {// 正在播放别的, 在播放这个
  1018. mAudioPalyer.stop();
  1019. mVoicePlayId = null;
  1020. if (mVoicePlayViewHolder != null) {
  1021. updateVoiceViewHolderIconStatus(false, mVoicePlayViewHolder);
  1022. }
  1023. try {
  1024. mAudioPalyer.play(voiceUrl);
  1025. } catch (Exception e) {
  1026. e.printStackTrace();
  1027. }
  1028. mVoicePlayId = message.getMessageId();
  1029. updateVoiceViewHolderIconStatus(true, viewHolder);
  1030. mVoicePlayViewHolder = viewHolder;
  1031. }
  1032. }
  1033. }
  1034. private void updateVoiceViewHolderIconStatus(boolean play, ViewHolder viewHolder) {
  1035. if (viewHolder instanceof NormalVoiceHolder) {// 普通音频
  1036. if (play) {
  1037. ((NormalVoiceHolder) viewHolder).voice_action_img.setImageResource(R.drawable.feed_main_player_pause);
  1038. } else {
  1039. ((NormalVoiceHolder) viewHolder).voice_action_img.setImageResource(R.drawable.feed_main_player_play);
  1040. }
  1041. } else {// 转载音频
  1042. if (play) {
  1043. ((FwVoiceHolder) viewHolder).voice_action_img.setImageResource(R.drawable.feed_main_player_pause);
  1044. } else {
  1045. ((FwVoiceHolder) viewHolder).voice_action_img.setImageResource(R.drawable.feed_main_player_play);
  1046. }
  1047. }
  1048. }
  1049. /**
  1050. * 节口回调的方法
  1051. */
  1052. @Override
  1053. public void ideChange() {
  1054. stopVoice();
  1055. }
  1056. /**
  1057. * 节口回调的方法,
  1058. */
  1059. @Override
  1060. public void ideChangeFragment() {
  1061. // stopVoiceIDE();
  1062. }
  1063. }