package com.jasonchen.microlang.adapter; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.support.v4.app.Fragment; import android.text.ClipboardManager; import android.text.TextPaint; import android.text.TextUtils; import android.util.LongSparseArray; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.GridLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupMenu; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.jasonchen.microlang.R; import com.jasonchen.microlang.activitys.UserActivity; import com.jasonchen.microlang.activitys.WeiboDetailActivity; import com.jasonchen.microlang.activitys.WriteReplyActivity; import com.jasonchen.microlang.beans.CommentBean; import com.jasonchen.microlang.beans.MessageBean; import com.jasonchen.microlang.beans.UserBean; import com.jasonchen.microlang.swiperefresh.LoadListView; import com.jasonchen.microlang.utils.GlobalContext; import com.jasonchen.microlang.utils.HackyMovementMethod; import com.jasonchen.microlang.utils.SettingUtility; import com.jasonchen.microlang.utils.TimeLineUtility; import com.jasonchen.microlang.utils.Utility; import com.jasonchen.microlang.utils.ViewUtility; import com.jasonchen.microlang.utils.file.FileLocationMethod; import com.jasonchen.microlang.view.HackyTextView; import com.jasonchen.microlang.view.TimeLineRoundAvatarImageView; import com.jasonchen.microlang.view.TimeTextView; import com.jasonchen.microlang.workers.PictureBitmapDrawable; import com.jasonchen.microlang.workers.TimeLineBitmapDownloader; import java.util.HashSet; import java.util.List; import java.util.Set; /** * jasonchen * 2015/04/10 */ public class MentionCommentAdapter extends BaseAdapter { public static final int NO_ITEM_ID = -1; private Set<Integer> tagIndexList = new HashSet<Integer>(); protected boolean showOriStatus = true; private boolean isFling = false; private List<CommentBean> list; private Context context; private Fragment fragment; private LoadListView listView; private LayoutInflater inflater; @SuppressLint("NewApi") private LongSparseArray<Integer> msgHeights = new LongSparseArray<Integer>(); @SuppressLint("NewApi") private LongSparseArray<Integer> msgWidths = new LongSparseArray<Integer>(); @SuppressLint("NewApi") private LongSparseArray<Integer> oriMsgHeights = new LongSparseArray<Integer>(); @SuppressLint("NewApi") private LongSparseArray<Integer> oriMsgWidths = new LongSparseArray<Integer>(); public MentionCommentAdapter(Fragment fragment, LoadListView listView, List<CommentBean> list, Context context) { super(); this.list = list; this.context = context; this.fragment = fragment; this.listView = listView; this.inflater = fragment.getActivity().getLayoutInflater(); listView.setRecyclerListener( new AbsListView.RecyclerListener() { @Override public void onMovedToScrapHeap(View view) { Integer index = (Integer) view .getTag(R.string.listview_index_tag); if (index == null) { return; } for (Integer tag : tagIndexList) { ViewHolder holder = (ViewHolder) view.getTag(tag); if (holder != null) { Drawable drawable = holder.avatar .getImageView().getDrawable(); clearAvatarBitmap(holder, drawable); if (!tag.equals(index)) { holder.root.removeAllViewsInLayout(); holder.root = null; view.setTag(tag, null); } } } } void clearAvatarBitmap(ViewHolder holder, Drawable drawable) { if (!(drawable instanceof PictureBitmapDrawable)) { holder.avatar.setImageDrawable(null); holder.avatar.getImageView().clearAnimation(); } } }); } protected android.support.v4.app.FragmentActivity getActivity() { return fragment.getActivity(); } public void setList(List<CommentBean> list) { this.list = list; } @Override public int getCount() { if (getList() != null) { return list.size(); } else { return 0; } } public List<CommentBean> getList() { return list; } @Override public Object getItem(int position) { if (position >= 0 && getList() != null && getList().size() > 0 && position < getList().size()) { return getList().get(position); } return null; } @Override public long getItemId(int position) { if (getList() != null && getList().get(position) != null && getList().size() > 0 && position < getList().size()) { return Long.valueOf(getList().get(position).getId()); } else { return NO_ITEM_ID; } } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = new ViewHolder(); int itemViewType = getItemViewType(position); if (convertView == null || convertView.getTag(R.drawable.ic_launcher + itemViewType) == null) { convertView = inflater.inflate( R.layout.mention_comment_normal_layout, parent, false); //msg layout holder.username = ViewUtility.findViewById(convertView, R.id.username); TextPaint tp = holder.username.getPaint(); if (tp != null) { tp.setFakeBoldText(true); } holder.root = ViewUtility.findViewById(convertView, R.id.root); holder.avatar = ViewUtility.findViewById(convertView, R.id.avatar); holder.ori_content = ViewUtility.findViewById(convertView, R.id.repost_content); holder.time = ViewUtility.findViewById(convertView, R.id.time); holder.source = ViewUtility.findViewById(convertView, R.id.source); holder.more = ViewUtility.findViewById(convertView, R.id.more); holder.content = ViewUtility.findViewById(convertView, R.id.content); //repost msg layout holder.ori_layout = ViewUtility.findViewById(convertView, R.id.repost_layout); holder.ori_comment = ViewUtility.findViewById(convertView, R.id.ori_comment); holder.ori_comment_flag = ViewUtility.findViewById(convertView, R.id.ori_comment_flag); holder.ori_content = ViewUtility.findViewById(convertView, R.id.repost_content); holder.root.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { } }); //set tag for convertview convertView.setTag(R.drawable.ic_launcher + getItemViewType(position), holder); convertView.setTag(R.string.listview_index_tag, R.drawable.ic_launcher + getItemViewType(position)); tagIndexList.add(R.drawable.ic_launcher + getItemViewType(position)); } else { holder = (ViewHolder) convertView .getTag(R.drawable.ic_launcher + getItemViewType(position)); } configViewFont(holder); bindViewData(holder, position); return convertView; } @SuppressLint("NewApi") private void bindViewData(final ViewHolder holder, final int position) { final CommentBean msg = list.get(position); UserBean user = msg.getUser(); holder.more.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final PopupMenu popupMenu = new PopupMenu(getActivity(), holder.more); popupMenu.inflate(R.menu.menu_mention_comment); Menu menu = popupMenu.getMenu(); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { int id = item.getItemId(); if(id == R.id.copy){ ClipboardManager cmb = (ClipboardManager) getActivity().getSystemService(getActivity().CLIPBOARD_SERVICE); cmb.setText(msg.getText().toString()); Toast.makeText(getActivity(), getActivity().getString(R.string.copy_successfully), Toast.LENGTH_SHORT).show(); popupMenu.dismiss(); }else if(id == R.id.reply){ popupMenu.dismiss(); getActivity().startActivity(WriteReplyActivity.newIntent(getActivity(), GlobalContext.getInstance().getAccountBean(), msg, GlobalContext.getInstance().getSpecialToken())); getActivity().overridePendingTransition(R.anim.push_left_in, R.anim.stay); }else if(id == R.id.show_ori){ popupMenu.dismiss(); getActivity().startActivity(WeiboDetailActivity.newIntent(getActivity(), GlobalContext.getInstance().getAccountBean(), msg.getStatus(), GlobalContext.getInstance().getSpecialToken())); getActivity().overridePendingTransition(R.anim.push_left_in, R.anim.stay); } return true; } }); popupMenu.show(); } }); if (user != null) { holder.username.setVisibility(View.VISIBLE); if (!TextUtils.isEmpty(user.getRemark())) { holder.username .setText(new StringBuilder(user.getScreen_name()) .append("(").append(user.getRemark()) .append(")").toString()); } else { holder.username.setText(user.getScreen_name()); } if (!showOriStatus && !SettingUtility.getEnableCommentRepostListAvatar()) { holder.avatar.setLayoutParams(new RelativeLayout.LayoutParams( 0, 0)); } else { buildAvatar(holder.avatar, position, user); } } else { holder.username.setVisibility(View.INVISIBLE); holder.avatar.setVisibility(View.INVISIBLE); } if (!TextUtils.isEmpty(msg.getListViewSpannableString())) { boolean haveCachedHeight = msgHeights.get(msg.getIdLong()) != null; LayoutParams layoutParams = holder.content .getLayoutParams(); if (haveCachedHeight) { layoutParams.height = msgHeights.get(msg.getIdLong()); } else { layoutParams.height = LayoutParams.WRAP_CONTENT; } if(msg.getReply_comment() != null){ holder.ori_comment.setVisibility(View.VISIBLE); holder.ori_comment_flag.setVisibility(View.VISIBLE); holder.ori_comment.setText(msg.getReply_comment().getListViewSpannableString()); }else{ holder.ori_comment.setVisibility(View.GONE); holder.ori_comment_flag.setVisibility(View.GONE); } boolean haveCachedWidth = msgWidths.get(msg.getIdLong()) != null; if (haveCachedWidth) { layoutParams.width = msgWidths.get(msg.getIdLong()); } else { layoutParams.width = LayoutParams.WRAP_CONTENT; } holder.content.requestLayout(); holder.content.setText(msg.getListViewSpannableString()); if (!haveCachedHeight) { msgHeights.append(msg.getIdLong(), layoutParams.height); } if (!haveCachedWidth) { msgWidths.append(msg.getIdLong(), layoutParams.width); } } else { if(msg.getReply_comment() != null){ holder.ori_comment.setVisibility(View.VISIBLE); holder.ori_comment_flag.setVisibility(View.VISIBLE); holder.ori_comment.setText(msg.getReply_comment().getListViewSpannableString()); }else{ holder.ori_comment.setVisibility(View.GONE); holder.ori_comment_flag.setVisibility(View.GONE); } TimeLineUtility.addJustHighLightLinks(msg); holder.content.setText(msg.getListViewSpannableString()); } holder.content.setMovementMethod(HackyMovementMethod.getInstance()); holder.time.setTime(msg.getMills()); if (holder.source != null) { holder.source.setText(msg.getSourceString()); } holder.ori_layout.setVisibility(View.GONE); final MessageBean ori_msg = msg.getStatus(); if (ori_msg != null && showOriStatus) { if (holder.ori_layout != null) { holder.ori_layout.setVisibility(View.VISIBLE); } buildRepostContent(msg, ori_msg, holder, position); } else { if (holder.ori_layout != null) { holder.ori_layout.setVisibility(View.GONE); } } } public void setIsFling(boolean isFling) { this.isFling = isFling; } @SuppressLint("NewApi") private void buildRepostContent(CommentBean msg, final MessageBean ori_msg, ViewHolder holder, int position) { holder.ori_layout.setVisibility(View.VISIBLE); if (!ori_msg.getId().equals((String) holder.ori_content.getTag())) { boolean haveCachedHeight = oriMsgHeights.get(msg.getIdLong()) != null; LayoutParams layoutParams = holder.ori_content .getLayoutParams(); if (haveCachedHeight) { layoutParams.height = oriMsgHeights.get(msg.getIdLong()); } else { layoutParams.height = LayoutParams.WRAP_CONTENT; } boolean haveCachedWidth = oriMsgWidths.get(msg.getIdLong()) != null; if (haveCachedWidth) { layoutParams.width = oriMsgWidths.get(msg.getIdLong()); } else { layoutParams.width = LayoutParams.WRAP_CONTENT; } holder.ori_content.requestLayout(); holder.ori_content.setText(ori_msg .getListViewSpannableString()); if (!haveCachedHeight) { oriMsgHeights.append(msg.getIdLong(), layoutParams.height); } if (!haveCachedWidth) { oriMsgWidths.append(msg.getIdLong(), layoutParams.width); } holder.ori_content.setTag(ori_msg.getId()); } else { holder.ori_content.setText(ori_msg .getListViewSpannableString()); } holder.ori_content.setMovementMethod(HackyMovementMethod.getInstance()); } protected void buildAvatar(TimeLineRoundAvatarImageView view, int position, final UserBean user) { view.setVisibility(View.VISIBLE); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = UserActivity.newIntent(getActivity(), user); getActivity().startActivity(intent); getActivity().overridePendingTransition(R.anim.push_left_in, R.anim.stay); } }); view.checkVerified(user); buildAvatar(view.getImageView(), position, user); } protected void buildAvatar(ImageView view, int position, final UserBean user) { String image_url = user.getProfile_image_url(); if (!TextUtils.isEmpty(image_url)) { view.setVisibility(View.VISIBLE); LayoutParams params = view.getLayoutParams(); TimeLineBitmapDownloader.getInstance().downloadAvatar(view, user, false); } else { view.setVisibility(View.GONE); } } public static class ViewHolder { LinearLayout root; TextView username; HackyTextView content; TimeTextView time; TextView source; ImageView more; TimeLineRoundAvatarImageView avatar; LinearLayout ori_layout; HackyTextView ori_comment; LinearLayout ori_comment_flag; HackyTextView ori_content; } private void configViewFont(ViewHolder holder) { int prefFontSizeSp = SettingUtility.getFontSize(); float currentWidgetTextSizePx; currentWidgetTextSizePx = holder.content.getTextSize(); if (Utility.sp2px(prefFontSizeSp - 2) != currentWidgetTextSizePx) { holder.content.setTextSize(prefFontSizeSp - 2); } } }