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);
}
});
}
}