package com.lh.fly.ui.adapter; import android.content.Context; import android.support.design.widget.Snackbar; import android.support.v7.widget.RecyclerView; import android.text.Html; import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.lh.fly.App; import com.lh.fly.R; import com.lh.fly.common.Defs; import com.lh.fly.common.date.TimeUtil; import com.lh.fly.common.log.Log; import com.mikepenz.materialdrawer.view.BezelImageView; import com.sina.weibo.sdk.openapi.models.PicUrl; import com.sina.weibo.sdk.openapi.models.Status; import com.squareup.picasso.Picasso; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import butterknife.ButterKnife; import butterknife.InjectView; public class HomeStatusesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final String TAG = "HomeStatusesAdapter"; private Context mContext; private List<Status> mStatuses = new ArrayList<>(); private LayoutInflater mLayoutInflater; private int statusUserAvatarHDSize; public HomeStatusesAdapter(Context context) { mContext = context; mLayoutInflater = LayoutInflater.from(mContext); statusUserAvatarHDSize = mContext.getResources().getDimensionPixelSize(R.dimen.status_user_avatar_hd_size); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new HomeStatusesViewHolder( mLayoutInflater.inflate(R.layout.activity_home_item_statuses, parent, false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Status status = mStatuses.get(position); Log.i(TAG, "position" + position + " " + status.toString()); if (holder instanceof HomeStatusesViewHolder) { HomeStatusesViewHolder homeStatusesViewHolder = (HomeStatusesViewHolder) holder; // 加载头像 Picasso.with(mContext) .load(status.user.avatar_hd) .placeholder(R.drawable.ic_launcher) .error(R.drawable.ic_launcher) .resize(statusUserAvatarHDSize, statusUserAvatarHDSize) .centerCrop() .into(homeStatusesViewHolder.ivStatusUserAvatarHd); homeStatusesViewHolder.tvStatusUserScreenName.setText(status.user.screen_name); homeStatusesViewHolder.tvStatusCreatedAt.setText(TimeUtil.getFormatTime(status.created_at)); // 设置来源可点击 homeStatusesViewHolder.tvStatusSource.setText(Html.fromHtml(status.source)); homeStatusesViewHolder.tvStatusSource.setMovementMethod(LinkMovementMethod.getInstance()); homeStatusesViewHolder.tvStatusText.setText(status.text); // 加载图片 loadImg(status, homeStatusesViewHolder.vsPicUrls); // 转发内容 Status retweetedStatus = status.retweeted_status; ViewStub vsRetweetedStatus = homeStatusesViewHolder.vsRetweetedStatus; // 防止ViewStub inflate 多次 if (null != retweetedStatus) { vsRetweetedStatus.setOnInflateListener(new ViewStub.OnInflateListener() { @Override public void onInflate(ViewStub viewStub, View view) { viewStub.setTag(view); } }); LinearLayout llRetweetedStatus; if (vsRetweetedStatus.getTag() == null) { llRetweetedStatus = (LinearLayout) vsRetweetedStatus.inflate(); } else { llRetweetedStatus = (LinearLayout) vsRetweetedStatus.getTag(); llRetweetedStatus.setVisibility(View.VISIBLE); } TextView tvRetweetedStatusText = (TextView) llRetweetedStatus.findViewById(R.id.tv_retweeted_status_text); ViewStub vsRetweetedStatusPicUrls = (ViewStub) llRetweetedStatus.findViewById(R.id.vs_retweeted_status_pic_urls); tvRetweetedStatusText.setText(retweetedStatus.text); if (null != vsRetweetedStatusPicUrls) { loadImg(retweetedStatus, vsRetweetedStatusPicUrls); } } else { if (vsRetweetedStatus.getTag() != null) { ((View) vsRetweetedStatus.getTag()).setVisibility(View.GONE); } } homeStatusesViewHolder.llStatusReposts.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(App.getAppContext(), "转 发", Toast.LENGTH_SHORT).show(); } }); homeStatusesViewHolder.llStatusComments.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Snackbar comes out", Snackbar.LENGTH_LONG) .setAction("Action", new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText( App.getAppContext(), "Toast comes out", Toast.LENGTH_SHORT).show(); } }).show(); } }); homeStatusesViewHolder.llStatusAttitudes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(App.getAppContext(), "点 赞", Toast.LENGTH_SHORT).show(); } }); homeStatusesViewHolder.tvStatusReposts.setText(String.valueOf(status.reposts_count)); homeStatusesViewHolder.tvStatusComments.setText(String.valueOf(status.comments_count)); homeStatusesViewHolder.tvStatusAttitudes.setText(String.valueOf(status.attitudes_count)); extractMention2Link(homeStatusesViewHolder.tvStatusText); } } @Override public int getItemCount() { return mStatuses == null ? 0 : mStatuses.size(); } public void update(List<Status> statuses) { if (mStatuses.contains(statuses)) { mStatuses = statuses; } else { mStatuses.addAll(statuses); } notifyDataSetChanged(); } private void loadImg(Status status, ViewStub vsPicUrls) { // 图片 List<PicUrl> picUrls = status.pic_urls; // 防止ViewStub inflate 多次 if (null != picUrls && picUrls.size() > 0) { vsPicUrls.setOnInflateListener(new ViewStub.OnInflateListener() { @Override public void onInflate(ViewStub stub, View inflated) { stub.setTag(inflated); } }); FrameLayout imgs; if (vsPicUrls.getTag() == null) { imgs = (FrameLayout) vsPicUrls.inflate(); } else { imgs = (FrameLayout) vsPicUrls.getTag(); imgs.setVisibility(View.VISIBLE); } if (picUrls.size() == 1) { ImageView singleImg = (ImageView) imgs.findViewById(R.id.iv_single_img); singleImg.setVisibility(View.VISIBLE); Picasso.with(mContext) .load(picUrls.get(0).thumbnail_pic) .resize(statusUserAvatarHDSize, statusUserAvatarHDSize) .centerCrop() .into(singleImg); } else { } } else { if (vsPicUrls.getTag() != null) { ((FrameLayout) vsPicUrls.getTag()).setVisibility(View.GONE); } } } public static class HomeStatusesViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.iv_status_user_avatar_hd) BezelImageView ivStatusUserAvatarHd; @InjectView(R.id.tv_status_user_screen_name) TextView tvStatusUserScreenName; @InjectView(R.id.tv_status_created_at) TextView tvStatusCreatedAt; @InjectView(R.id.tv_status_source) TextView tvStatusSource; @InjectView(R.id.tv_status_text) TextView tvStatusText; @InjectView(R.id.vs_status_pic_urls) ViewStub vsPicUrls; @InjectView(R.id.vs_retweeted_status) ViewStub vsRetweetedStatus; @InjectView(R.id.tv_status_reposts) TextView tvStatusReposts; @InjectView(R.id.ll_status_reposts) LinearLayout llStatusReposts; @InjectView(R.id.tv_status_comments) TextView tvStatusComments; @InjectView(R.id.ll_status_comments) LinearLayout llStatusComments; @InjectView(R.id.tv_status_attitudes) TextView tvStatusAttitudes; @InjectView(R.id.ll_status_attitudes) LinearLayout llStatusAttitudes; HomeStatusesViewHolder(View view) { super(view); ButterKnife.inject(this, view); } } public static void extractMention2Link(TextView v) { v.setAutoLinkMask(0); Pattern mentionsPattern = Pattern.compile("@(\\w+?)(?=\\W|$)(.)"); String mentionsScheme = String.format("%s/?%s=", Defs.MENTIONS_SCHEMA, Defs.PARAM_UID); Linkify.addLinks(v, mentionsPattern, mentionsScheme, new Linkify.MatchFilter() { @Override public boolean acceptMatch(CharSequence s, int start, int end) { return s.charAt(end - 1) != '.'; } }, new Linkify.TransformFilter() { @Override public String transformUrl(Matcher match, String url) { android.util.Log.d(TAG, match.group(1)); return match.group(1); } }); Pattern trendsPattern = Pattern.compile("#(\\w+?)#"); String trendsScheme = String.format("%s/?%s=", Defs.TRENDS_SCHEMA, Defs.PARAM_UID); Linkify.addLinks(v, trendsPattern, trendsScheme, null, new Linkify.TransformFilter() { @Override public String transformUrl(Matcher match, String url) { android.util.Log.d(TAG, match.group(1)); return match.group(1); } }); } }