848 lines
34 KiB
Plaintext
848 lines
34 KiB
Plaintext
package com.novelbook.android.adapter;
|
||
|
||
import android.annotation.SuppressLint;
|
||
import android.app.Activity;
|
||
import android.content.Context;
|
||
import android.support.annotation.NonNull;
|
||
import android.support.v7.widget.GridLayoutManager;
|
||
import android.support.v7.widget.RecyclerView;
|
||
import android.support.v7.widget.StaggeredGridLayoutManager;
|
||
import android.text.TextUtils;
|
||
import android.util.Log;
|
||
import android.view.LayoutInflater;
|
||
import android.view.View;
|
||
import android.view.ViewGroup;
|
||
import android.widget.Button;
|
||
import android.widget.FrameLayout;
|
||
import android.widget.ImageView;
|
||
import android.widget.LinearLayout;
|
||
import android.widget.ProgressBar;
|
||
import android.widget.TextView;
|
||
|
||
import com.androidquery.callback.AQuery2;
|
||
import com.androidquery.callback.ImageOptions;
|
||
import com.bytedance.sdk.openadsdk.DownloadStatusController;
|
||
import com.bytedance.sdk.openadsdk.TTAdConstant;
|
||
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
|
||
import com.bytedance.sdk.openadsdk.TTFeedAd;
|
||
import com.bytedance.sdk.openadsdk.TTImage;
|
||
import com.bytedance.sdk.openadsdk.TTNativeAd;
|
||
import com.novelbook.android.AD.toutiao.TToast;
|
||
import com.novelbook.android.BookActivity;
|
||
import com.novelbook.android.R;
|
||
import com.novelbook.android.db.Novel;
|
||
|
||
import com.novelbook.android.netutils.NetUtil;
|
||
import com.novelbook.android.utils.CommonUtil;
|
||
import com.novelbook.android.utils.ImageUtil;
|
||
import com.novelbook.android.utils.MyImageLoader;
|
||
import com.novelbook.android.utils.OnItemClickListener;
|
||
import com.qq.e.ads.nativ.NativeExpressADView;
|
||
|
||
import java.util.ArrayList;
|
||
import java.util.List;
|
||
import java.util.Map;
|
||
import java.util.WeakHashMap;
|
||
|
||
import butterknife.BindView;
|
||
import butterknife.ButterKnife;
|
||
import okhttp3.internal.Util;
|
||
|
||
import static com.novelbook.android.utils.ImageUtil.loader;
|
||
|
||
public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHolder> {
|
||
private final static String TAG= BookListAdapter.class.getSimpleName();
|
||
private final int EMPTY_VIEW = 1;
|
||
|
||
private static final int TYPE_ITEM = 2;
|
||
private static final int TYPE_FOOTER = 3;
|
||
private static final int NO_FOOTER = 4;
|
||
private static final int ITEM_VIEW_TYPE_GROUP_PIC_AD =5;
|
||
private static final int ITEM_VIEW_TYPE_SMALL_PIC_AD = 6;
|
||
private static final int ITEM_VIEW_TYPE_LARGE_PIC_AD = 7;
|
||
private static final int ITEM_VIEW_TYPE_VIDEO = 8;
|
||
private static final int ITEM_VIEW_TYPE_QQ_NATIVE_EXPRESS = 9;
|
||
|
||
|
||
// private MyImageLoader loader = new MyImageLoader();
|
||
private Context mContext;
|
||
private List mDatas ;
|
||
|
||
private OnItemClickListener mOnItemClickListener;
|
||
private int listItemID;
|
||
//private List<Novel> mBooks;
|
||
private LayoutInflater mInflater;
|
||
|
||
//上拉加载更多
|
||
public static final int PULLUP_LOAD_MORE = 0;
|
||
//正在加载中
|
||
public static final int LOADING_MORE = 1;
|
||
//没有加载更多 隐藏
|
||
public static final int NO_LOAD_MORE = 2;
|
||
|
||
//上拉加载更多状态-默认为0
|
||
private int mLoadMoreStatus = 2;
|
||
private boolean showFootView =false;
|
||
|
||
private float percent =0;
|
||
private int norecord =R.string.noRecord;
|
||
|
||
private boolean isShowTop=false;
|
||
|
||
public boolean isShowTop() {
|
||
return isShowTop;
|
||
}
|
||
|
||
public void setShowTop(boolean showTop) {
|
||
isShowTop = showTop;
|
||
|
||
}
|
||
|
||
public void setNorecord(int norecord) {
|
||
this.norecord = norecord;
|
||
}
|
||
|
||
public void setPercent(float percent) {
|
||
this.percent = percent;
|
||
}
|
||
|
||
private AQuery2 mAQuery;
|
||
private Map<AdViewHolder, TTAppDownloadListener> mTTAppDownloadListenerMap = new WeakHashMap<>();
|
||
public void setShowFootView(boolean showFootView) {
|
||
this.showFootView = showFootView;
|
||
}
|
||
|
||
public BookListAdapter(Context context, List<Novel> datas) {
|
||
mContext = context;
|
||
mInflater = LayoutInflater.from(mContext);
|
||
mDatas = datas;
|
||
this.mAQuery = new AQuery2(context);
|
||
}
|
||
|
||
public BookListAdapter(Context context, List<Novel> mBooks, int listItemID, OnItemClickListener clickLitener) {
|
||
this.mContext =context;
|
||
this.mDatas = mBooks;
|
||
this.mOnItemClickListener = clickLitener;
|
||
this.listItemID = listItemID;
|
||
mInflater = LayoutInflater.from(mContext);
|
||
this.mAQuery = new AQuery2(context);
|
||
}
|
||
|
||
|
||
|
||
public BookListAdapter(Context context, OnItemClickListener clickLitener) {
|
||
this.mContext = context;
|
||
this.mOnItemClickListener = clickLitener;
|
||
this.mAQuery = new AQuery2(context);
|
||
}
|
||
|
||
public void setListener(OnItemClickListener clickLitener){
|
||
this.mOnItemClickListener = clickLitener;
|
||
|
||
}
|
||
|
||
|
||
@Override
|
||
public int getItemViewType(int position) {
|
||
if (mDatas.size() == 0) {
|
||
return EMPTY_VIEW;
|
||
}else if ( position < mDatas.size()) {
|
||
//最后一个item设置为footerView
|
||
if (mDatas.get(position) instanceof Novel) {
|
||
return TYPE_ITEM;
|
||
} else if (mDatas.get(position) instanceof TTFeedAd) {
|
||
TTFeedAd ad = (TTFeedAd) mDatas.get(position);
|
||
Log.d(TAG, "getItemViewType: ad.getImageMode()= " +ad.getImageMode());
|
||
if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_SMALL_IMG) {
|
||
return ITEM_VIEW_TYPE_SMALL_PIC_AD;
|
||
} else if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_LARGE_IMG) {
|
||
return ITEM_VIEW_TYPE_LARGE_PIC_AD;
|
||
} else if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_GROUP_IMG) {
|
||
return ITEM_VIEW_TYPE_GROUP_PIC_AD;
|
||
} else if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_VIDEO) {
|
||
return ITEM_VIEW_TYPE_VIDEO;
|
||
}
|
||
return ITEM_VIEW_TYPE_SMALL_PIC_AD;
|
||
}else if(mDatas.get(position) instanceof NativeExpressADView ){
|
||
return ITEM_VIEW_TYPE_QQ_NATIVE_EXPRESS;
|
||
}
|
||
Log.d(TAG, String.format("getItemViewType exception 1: position %s, mDatas.get(position) %s ,mDatas.size %s",position, mDatas.get(position),mDatas.size() ));
|
||
}
|
||
else if ( position == mDatas.size()) {
|
||
//最后一个item设置为footerView
|
||
if(!showFootView){
|
||
return NO_FOOTER;
|
||
}
|
||
return TYPE_FOOTER;
|
||
} else {
|
||
return TYPE_ITEM;
|
||
}
|
||
Log.d(TAG, String.format("getItemViewType exception 2: position %s, mDatas.get(position) %s ,mDatas.size %s",position, mDatas.get(position),mDatas.size() ));
|
||
return EMPTY_VIEW;
|
||
|
||
// return super.getItemViewType(position);
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
@Override
|
||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||
|
||
switch (viewType) {
|
||
case TYPE_FOOTER:
|
||
return new FooterViewHolder(mInflater.inflate(R.layout.load_more_footview_layout, parent, false));
|
||
case EMPTY_VIEW:
|
||
return new EmptyViewHolder (mInflater.inflate(R.layout.recycle_list_empty_item, parent, false));
|
||
case NO_FOOTER:
|
||
return new NoShowViewHolder (mInflater.inflate(R.layout.recycle_list_noshow_item, parent, false));
|
||
case ITEM_VIEW_TYPE_SMALL_PIC_AD:
|
||
return new SmallAdViewHolder(mInflater.inflate(R.layout.listitem_ad_small_pic, parent, false));
|
||
case ITEM_VIEW_TYPE_LARGE_PIC_AD:
|
||
return new LargeAdViewHolder(mInflater.inflate(R.layout.listitem_ad_large_pic, parent, false));
|
||
case ITEM_VIEW_TYPE_GROUP_PIC_AD:
|
||
return new GroupAdViewHolder(mInflater.inflate(R.layout.listitem_ad_group_pic, parent, false));
|
||
case ITEM_VIEW_TYPE_VIDEO:
|
||
return new VideoAdViewHolder(mInflater.inflate(R.layout.listitem_ad_large_video, parent, false));
|
||
case ITEM_VIEW_TYPE_QQ_NATIVE_EXPRESS:
|
||
|
||
return new QQ_ExpressViewHolder(mInflater.inflate(R.layout.listitem_ad_qq_item_express, parent, false));
|
||
|
||
default:
|
||
return new MyViewHolder( mInflater.inflate(listItemID, parent, false));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
public void setBookList(List<Novel> bookLists){
|
||
this.mDatas = bookLists;
|
||
notifyDataSetChanged();
|
||
}
|
||
public void setParameters(List<Novel> mDatas, int listItemID) {
|
||
this.mDatas = mDatas;
|
||
this.listItemID = listItemID;
|
||
}
|
||
|
||
public void setOnItemClickLitener(OnItemClickListener mOnItemClickLitener) {
|
||
this.mOnItemClickListener = mOnItemClickLitener;
|
||
}
|
||
|
||
@Override
|
||
public void onBindViewHolder(RecyclerView.ViewHolder hd, int position) {
|
||
|
||
TTFeedAd ttFeedAd;
|
||
if (hd instanceof FooterViewHolder) {
|
||
|
||
|
||
FooterViewHolder footerViewHolder = (FooterViewHolder) hd;
|
||
|
||
|
||
switch (mLoadMoreStatus) {
|
||
case PULLUP_LOAD_MORE:
|
||
footerViewHolder.mTvLoadText.setText(String.format("上拉加载更多.."));
|
||
break;
|
||
case LOADING_MORE:
|
||
footerViewHolder.mTvLoadText.setText("正加载更多...");
|
||
break;
|
||
case NO_LOAD_MORE:
|
||
if(!showFootView){
|
||
footerViewHolder.mLoadLayout.setVisibility(View.GONE);
|
||
footerViewHolder.itemView.setVisibility(View.GONE);
|
||
return;
|
||
}
|
||
//隐藏加载更多
|
||
footerViewHolder.mTvLoadText.setText("到底了");
|
||
|
||
break;
|
||
|
||
}
|
||
}else if (hd instanceof EmptyViewHolder) {
|
||
EmptyViewHolder holder = (EmptyViewHolder) hd;
|
||
holder.tvEmpty.setVisibility(View.GONE);
|
||
if (mDatas == null || mDatas != null && mDatas.size() == 0) {
|
||
holder.tvEmpty.setVisibility(View.VISIBLE);
|
||
holder.tvEmpty.setText(norecord);
|
||
}
|
||
}else if (hd instanceof QQ_ExpressViewHolder) {
|
||
QQ_ExpressViewHolder holder = (QQ_ExpressViewHolder)hd;
|
||
// holder.title.setVisibility(View.VISIBLE);
|
||
final NativeExpressADView adView = (NativeExpressADView) mDatas.get(position);
|
||
// mAdViewPositionMap.put(adView, position); // 广告在列表中的位置是可以被更新的
|
||
if (holder.container.getChildCount() > 0
|
||
&& holder.container.getChildAt(0) == adView) {
|
||
return;
|
||
}
|
||
|
||
if (holder.container.getChildCount() > 0) {
|
||
holder.container.removeAllViews();
|
||
}
|
||
|
||
if (adView.getParent() != null) {
|
||
((ViewGroup) adView.getParent()).removeView(adView);
|
||
}
|
||
|
||
holder.container.addView(adView);
|
||
adView.render(); // 调用render方法后sdk才会开始展示广告
|
||
}
|
||
|
||
else if (hd instanceof MyViewHolder && mDatas.get(position) instanceof Novel) {
|
||
|
||
Novel novel =(Novel) mDatas.get(position);
|
||
MyViewHolder holder = (MyViewHolder)hd;
|
||
holder.tvTitle.setText(novel.getName());
|
||
if (holder.tvAuthor != null) holder.tvAuthor.setText(novel.getAuthor());
|
||
if (holder.tvCate != null) holder.tvCate.setText(novel.getNovelType());
|
||
if (holder.tvDesc != null) holder.tvDesc.setText(novel.getDesc());
|
||
|
||
if (holder.tvLastRead != null) holder.tvLastRead.setText(CommonUtil.getDateString( novel.getLastVisit() ));
|
||
// if (holder.tvProgress != null) holder.tvProgress.setText( String.format("上次看到第 %s 章,共%s章",mDatas.get(position).getLastReadChapt(),mDatas.get(position).getChaptCnt()) );
|
||
if (holder.tvProgress != null) holder.tvProgress.setText( String.format("上次看到第 %s 章",novel.getLastReadChapt(),novel.getChaptCnt()) );
|
||
if (holder.tvReadtime != null) holder.tvReadtime.setText( "总计阅读了 "+CommonUtil.getTimeCnt4Read( novel.getReadtime() ,true) );
|
||
|
||
|
||
if (holder.tvStatus != null) holder.tvStatus.setText(novel.getProgress());
|
||
if (holder.imageView != null/* && !TextUtils.isEmpty(mDatas.get(position).getCover())*/) {
|
||
// ImageUtil.loadImage(mContext, mDatas.get(position).getCover(), holder.imageView);
|
||
loader.displayImage(mContext, NetUtil.getCoverUrl(novel.getCover()) ,holder.imageView);
|
||
}
|
||
if (holder.imageTop != null) {
|
||
if( novel.isTop()){
|
||
holder.imageTop.setVisibility(View.VISIBLE);
|
||
}else{
|
||
holder.imageTop.setVisibility(View.GONE);
|
||
}
|
||
|
||
}
|
||
if(isShowTop) {
|
||
if (holder.imageTop1 != null) {
|
||
if (position == 0) {
|
||
holder.imageTop1.setVisibility(View.VISIBLE);
|
||
} else {
|
||
holder.imageTop1.setVisibility(View.GONE);
|
||
}
|
||
}
|
||
if (holder.imageTop2 != null) {
|
||
if (position == 1) {
|
||
holder.imageTop2.setVisibility(View.VISIBLE);
|
||
} else {
|
||
holder.imageTop2.setVisibility(View.GONE);
|
||
}
|
||
}
|
||
if (holder.imageTop3 != null) {
|
||
if (position == 2) {
|
||
holder.imageTop3.setVisibility(View.VISIBLE);
|
||
} else {
|
||
holder.imageTop3.setVisibility(View.GONE);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (holder.imageUpdate != null) {
|
||
if( novel.isUpdated()){
|
||
Log.d(TAG, String.format("checkshelf:novel %s has new update",novel.getName()));
|
||
holder.imageUpdate.setVisibility(View.VISIBLE);
|
||
}else{
|
||
holder.imageUpdate.setVisibility(View.GONE);
|
||
}
|
||
|
||
}
|
||
if (holder.tvNum != null) holder.tvNum.setText("999");
|
||
// 如果设置了回调,则设置点击事件
|
||
if (mOnItemClickListener != null) {
|
||
holder.itemView.setOnClickListener(new View.OnClickListener() {
|
||
@Override
|
||
public void onClick(View v) {
|
||
int pos = holder.getLayoutPosition();
|
||
mOnItemClickListener.onItemClick(holder.itemView, pos);
|
||
}
|
||
});
|
||
|
||
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
|
||
@Override
|
||
public boolean onLongClick(View v) {
|
||
int pos = holder.getLayoutPosition();
|
||
mOnItemClickListener.onItemLongClick(holder.itemView, pos);
|
||
return false;
|
||
}
|
||
});
|
||
}
|
||
}else if (hd instanceof SmallAdViewHolder) {
|
||
ttFeedAd =(TTFeedAd) mDatas.get(position);
|
||
SmallAdViewHolder smallAdViewHolder = (SmallAdViewHolder) hd;
|
||
bindData(smallAdViewHolder, ttFeedAd);
|
||
if (ttFeedAd.getImageList() != null && !ttFeedAd.getImageList().isEmpty()) {
|
||
TTImage image = ttFeedAd.getImageList().get(0);
|
||
if (image != null && image.isValid()) {
|
||
mAQuery.id(smallAdViewHolder.mSmallImage).image(image.getImageUrl());
|
||
}
|
||
}
|
||
|
||
} else if (hd instanceof LargeAdViewHolder) {
|
||
ttFeedAd =(TTFeedAd) mDatas.get(position);
|
||
LargeAdViewHolder largeAdViewHolder = (LargeAdViewHolder) hd;
|
||
bindData(largeAdViewHolder, ttFeedAd);
|
||
if (ttFeedAd.getImageList() != null && !ttFeedAd.getImageList().isEmpty()) {
|
||
TTImage image = ttFeedAd.getImageList().get(0);
|
||
if (image != null && image.isValid()) {
|
||
mAQuery.id(largeAdViewHolder.mLargeImage).image(image.getImageUrl());
|
||
}
|
||
}
|
||
|
||
} else if (hd instanceof GroupAdViewHolder) {
|
||
ttFeedAd =(TTFeedAd) mDatas.get(position);
|
||
GroupAdViewHolder groupAdViewHolder = (GroupAdViewHolder) hd;
|
||
bindData(groupAdViewHolder, ttFeedAd);
|
||
if (ttFeedAd.getImageList() != null && ttFeedAd.getImageList().size() >= 3) {
|
||
TTImage image1 = ttFeedAd.getImageList().get(0);
|
||
TTImage image2 = ttFeedAd.getImageList().get(1);
|
||
TTImage image3 = ttFeedAd.getImageList().get(2);
|
||
if (image1 != null && image1.isValid()) {
|
||
mAQuery.id(groupAdViewHolder.mGroupImage1).image(image1.getImageUrl());
|
||
}
|
||
if (image2 != null && image2.isValid()) {
|
||
mAQuery.id(groupAdViewHolder.mGroupImage2).image(image2.getImageUrl());
|
||
}
|
||
if (image3 != null && image3.isValid()) {
|
||
mAQuery.id(groupAdViewHolder.mGroupImage3).image(image3.getImageUrl());
|
||
}
|
||
}
|
||
|
||
} else if (hd instanceof VideoAdViewHolder) {
|
||
ttFeedAd = (TTFeedAd)mDatas.get(position);
|
||
VideoAdViewHolder videoAdViewHolder = (VideoAdViewHolder) hd;
|
||
bindData(videoAdViewHolder, ttFeedAd);
|
||
ttFeedAd.setVideoAdListener(new TTFeedAd.VideoAdListener() {
|
||
@Override
|
||
public void onVideoLoad(TTFeedAd ad) {
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onVideoError(int errorCode, int extraCode) {
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onVideoAdStartPlay(TTFeedAd ad) {
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onVideoAdPaused(TTFeedAd ad) {
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onVideoAdContinuePlay(TTFeedAd ad) {
|
||
|
||
}
|
||
});
|
||
if (videoAdViewHolder.videoView != null) {
|
||
View video = ttFeedAd.getAdView();
|
||
if (video != null) {
|
||
if (video.getParent() == null) {
|
||
videoAdViewHolder.videoView.removeAllViews();
|
||
videoAdViewHolder.videoView.addView(video);
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public int getItemCount() {
|
||
return mDatas.size()+1;
|
||
}
|
||
|
||
public void addData(int position) {
|
||
// mDatas.add(position, "Insert One");
|
||
notifyItemInserted(position);
|
||
}
|
||
|
||
public void removeData(int position) {
|
||
mDatas.remove(position);
|
||
notifyItemRemoved(position);
|
||
}
|
||
|
||
//to set booklist updated, used in shelf
|
||
public void setUpdate(List<Novel> lstUpdate) {
|
||
|
||
|
||
}
|
||
|
||
public class FooterViewHolder extends RecyclerView.ViewHolder {
|
||
@BindView(R.id.pbLoad)
|
||
ProgressBar mPbLoad;
|
||
@BindView(R.id.tvLoadText)
|
||
TextView mTvLoadText;
|
||
@BindView(R.id.loadLayout)
|
||
LinearLayout mLoadLayout;
|
||
public FooterViewHolder(View itemView) {
|
||
super(itemView);
|
||
ButterKnife.bind(this,itemView);
|
||
}
|
||
}
|
||
class EmptyViewHolder extends RecyclerView.ViewHolder {
|
||
@BindView(R.id.tvLoadText)
|
||
TextView tvEmpty;
|
||
public EmptyViewHolder(View itemView) {
|
||
super(itemView);
|
||
ButterKnife.bind(this,itemView);
|
||
}
|
||
}
|
||
class NoShowViewHolder extends RecyclerView.ViewHolder {
|
||
|
||
public NoShowViewHolder(View itemView) {
|
||
super(itemView);
|
||
|
||
}
|
||
}
|
||
public void AddHeaderItem(List items) {
|
||
if(mDatas.size()>3 &&( mDatas.get(3) instanceof TTFeedAd) ){
|
||
return;
|
||
}
|
||
int p = mDatas.size()>3?3:0;
|
||
mDatas.addAll(p, items);
|
||
notifyDataSetChanged();
|
||
}
|
||
public void setData(List<Novel> items) {
|
||
// mDatas.add(position, "Insert One");
|
||
mDatas = items;
|
||
notifyDataSetChanged();
|
||
}
|
||
public void AddFooterItem(List items) {
|
||
mDatas.addAll(items);
|
||
notifyDataSetChanged();
|
||
}
|
||
/**
|
||
* 更新加载更多状态
|
||
* @param status
|
||
*/
|
||
public void changeMoreStatus(int status){
|
||
mLoadMoreStatus=status;
|
||
notifyDataSetChanged();
|
||
}
|
||
|
||
@Override
|
||
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
|
||
super.onAttachedToRecyclerView(recyclerView);
|
||
|
||
RecyclerView.LayoutManager layout = recyclerView.getLayoutManager();
|
||
if (layout != null && layout instanceof GridLayoutManager) {
|
||
final GridLayoutManager manager = (GridLayoutManager) layout;
|
||
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
|
||
@Override
|
||
public int getSpanSize(int position) {
|
||
int type = getItemViewType(position);
|
||
if (/*type == ITEM_VIEW_TYPE_LOAD_MORE ||*/ type == ITEM_VIEW_TYPE_VIDEO) {
|
||
return manager.getSpanCount();
|
||
}
|
||
return 1;
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {
|
||
//noinspection unchecked
|
||
super.onViewAttachedToWindow(holder);
|
||
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
|
||
if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) {
|
||
int position = holder.getLayoutPosition();
|
||
int type = getItemViewType(position);
|
||
if (/*type == ITEM_VIEW_TYPE_LOAD_MORE || */type == ITEM_VIEW_TYPE_VIDEO) {
|
||
StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
|
||
p.setFullSpan(true);
|
||
}
|
||
}
|
||
}
|
||
|
||
@SuppressWarnings("WeakerAccess")
|
||
private static class VideoAdViewHolder extends AdViewHolder {
|
||
@SuppressWarnings("CanBeFinal")
|
||
FrameLayout videoView;
|
||
|
||
@SuppressWarnings("RedundantCast")
|
||
public VideoAdViewHolder(View itemView) {
|
||
super(itemView);
|
||
|
||
mTitle = (TextView) itemView.findViewById(R.id.tv_listitem_ad_title);
|
||
mDescription = (TextView) itemView.findViewById(R.id.tv_listitem_ad_desc);
|
||
mSource = (TextView) itemView.findViewById(R.id.tv_listitem_ad_source);
|
||
videoView = (FrameLayout) itemView.findViewById(R.id.iv_listitem_video);
|
||
mIcon = (ImageView) itemView.findViewById(R.id.iv_listitem_icon);
|
||
mCreativeButton = (Button) itemView.findViewById(R.id.btn_listitem_creative);
|
||
// mStopButton = (Button) itemView.findViewById(R.id.btn_listitem_stop);
|
||
// mRemoveButton = (Button) itemView.findViewById(R.id.btn_listitem_remove);
|
||
|
||
}
|
||
}
|
||
|
||
private static class LargeAdViewHolder extends AdViewHolder {
|
||
ImageView mLargeImage;
|
||
|
||
@SuppressWarnings("RedundantCast")
|
||
public LargeAdViewHolder(View itemView) {
|
||
super(itemView);
|
||
|
||
mTitle = (TextView) itemView.findViewById(R.id.tv_listitem_ad_title);
|
||
mDescription = (TextView) itemView.findViewById(R.id.tv_listitem_ad_desc);
|
||
mSource = (TextView) itemView.findViewById(R.id.tv_listitem_ad_source);
|
||
mLargeImage = (ImageView) itemView.findViewById(R.id.iv_listitem_image);
|
||
mIcon = (ImageView) itemView.findViewById(R.id.iv_listitem_icon);
|
||
mCreativeButton = (Button) itemView.findViewById(R.id.btn_listitem_creative);
|
||
// mStopButton = (Button) itemView.findViewById(R.id.btn_listitem_stop);
|
||
// mRemoveButton = (Button) itemView.findViewById(R.id.btn_listitem_remove);
|
||
}
|
||
}
|
||
|
||
private static class SmallAdViewHolder extends AdViewHolder {
|
||
ImageView mSmallImage;
|
||
|
||
@SuppressWarnings("RedundantCast")
|
||
public SmallAdViewHolder(View itemView) {
|
||
super(itemView);
|
||
|
||
mTitle = (TextView) itemView.findViewById(R.id.tv_listitem_ad_title);
|
||
mSource = (TextView) itemView.findViewById(R.id.tv_listitem_ad_source);
|
||
mDescription = (TextView) itemView.findViewById(R.id.tv_listitem_ad_desc);
|
||
mSmallImage = (ImageView) itemView.findViewById(R.id.iv_listitem_image);
|
||
mIcon = (ImageView) itemView.findViewById(R.id.iv_listitem_icon);
|
||
mCreativeButton = (Button) itemView.findViewById(R.id.btn_listitem_creative);
|
||
// mStopButton = (Button) itemView.findViewById(R.id.btn_listitem_stop);
|
||
// mRemoveButton = (Button) itemView.findViewById(R.id.btn_listitem_remove);
|
||
}
|
||
}
|
||
|
||
@SuppressWarnings("CanBeFinal")
|
||
private static class GroupAdViewHolder extends AdViewHolder {
|
||
ImageView mGroupImage1;
|
||
ImageView mGroupImage2;
|
||
ImageView mGroupImage3;
|
||
|
||
@SuppressWarnings("RedundantCast")
|
||
public GroupAdViewHolder(View itemView) {
|
||
super(itemView);
|
||
|
||
mTitle = (TextView) itemView.findViewById(R.id.tv_listitem_ad_title);
|
||
mSource = (TextView) itemView.findViewById(R.id.tv_listitem_ad_source);
|
||
mDescription = (TextView) itemView.findViewById(R.id.tv_listitem_ad_desc);
|
||
mGroupImage1 = (ImageView) itemView.findViewById(R.id.iv_listitem_image1);
|
||
mGroupImage2 = (ImageView) itemView.findViewById(R.id.iv_listitem_image2);
|
||
mGroupImage3 = (ImageView) itemView.findViewById(R.id.iv_listitem_image3);
|
||
mIcon = (ImageView) itemView.findViewById(R.id.iv_listitem_icon);
|
||
mCreativeButton = (Button) itemView.findViewById(R.id.btn_listitem_creative);
|
||
// mStopButton = (Button) itemView.findViewById(R.id.btn_listitem_stop);
|
||
// mRemoveButton = (Button) itemView.findViewById(R.id.btn_listitem_remove);
|
||
}
|
||
}
|
||
|
||
private static class AdViewHolder extends RecyclerView.ViewHolder {
|
||
ImageView mIcon;
|
||
Button mCreativeButton;
|
||
TextView mTitle;
|
||
TextView mDescription;
|
||
TextView mSource;
|
||
// Button mStopButton;
|
||
// Button mRemoveButton;
|
||
|
||
public AdViewHolder(View itemView) {
|
||
super(itemView);
|
||
}
|
||
}
|
||
|
||
class QQ_ExpressViewHolder extends RecyclerView.ViewHolder {
|
||
// public TextView title;
|
||
public ViewGroup container;
|
||
|
||
public QQ_ExpressViewHolder(View view) {
|
||
super(view);
|
||
// title = (TextView) view.findViewById(R.id.title);
|
||
container = (ViewGroup) view.findViewById(R.id.express_ad_container);
|
||
}
|
||
}
|
||
|
||
|
||
private void bindData(final AdViewHolder adViewHolder, TTFeedAd ad) {
|
||
//可以被点击的view, 也可以把convertView放进来意味item可被点击
|
||
List<View> clickViewList = new ArrayList<>();
|
||
clickViewList.add(adViewHolder.itemView);
|
||
//触发创意广告的view(点击下载或拨打电话)
|
||
List<View> creativeViewList = new ArrayList<>();
|
||
creativeViewList.add(adViewHolder.mCreativeButton);
|
||
//如果需要点击图文区域也能进行下载或者拨打电话动作,请将图文区域的view传入
|
||
// creativeViewList.add(convertView);
|
||
//重要! 这个涉及到广告计费,必须正确调用。convertView必须使用ViewGroup。
|
||
ad.registerViewForInteraction((ViewGroup) adViewHolder.itemView, clickViewList, creativeViewList, new TTNativeAd.AdInteractionListener() {
|
||
@Override
|
||
public void onAdClicked(View view, TTNativeAd ad) {
|
||
if (ad != null) {
|
||
// TToast.show(mContext, "广告" + ad.getTitle() + "被点击");
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onAdCreativeClick(View view, TTNativeAd ad) {
|
||
if (ad != null) {
|
||
// TToast.show(mContext, "广告" + ad.getTitle() + "被创意按钮被点击");
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onAdShow(TTNativeAd ad) {
|
||
if (ad != null) {
|
||
// TToast.show(mContext, "广告" + ad.getTitle() + "展示");
|
||
}
|
||
}
|
||
});
|
||
adViewHolder.mTitle.setText(ad.getTitle());
|
||
adViewHolder.mDescription.setText(ad.getDescription());
|
||
adViewHolder.mSource.setText(ad.getSource() == null ? "广告来源" : ad.getSource());
|
||
TTImage icon = ad.getIcon();
|
||
if (icon != null && icon.isValid()) {
|
||
ImageOptions options = new ImageOptions();
|
||
mAQuery.id(adViewHolder.mIcon).image(icon.getImageUrl(), options);
|
||
}
|
||
Button adCreativeButton = adViewHolder.mCreativeButton;
|
||
switch (ad.getInteractionType()) {
|
||
case TTAdConstant.INTERACTION_TYPE_DOWNLOAD:
|
||
//如果初始化ttAdManager.createAdNative(getApplicationContext())没有传入activity 则需要在此传activity,否则影响使用Dislike逻辑
|
||
if (mContext instanceof Activity) {
|
||
ad.setActivityForDownloadApp((Activity) mContext);
|
||
}
|
||
adCreativeButton.setVisibility(View.VISIBLE);
|
||
// adViewHolder.mStopButton.setVisibility(View.VISIBLE);
|
||
// adViewHolder.mRemoveButton.setVisibility(View.VISIBLE);
|
||
bindDownloadListener(adCreativeButton, adViewHolder, ad);
|
||
//绑定下载状态控制器
|
||
bindDownLoadStatusController(adViewHolder, ad);
|
||
break;
|
||
case TTAdConstant.INTERACTION_TYPE_DIAL:
|
||
adCreativeButton.setVisibility(View.VISIBLE);
|
||
adCreativeButton.setText("立即拨打");
|
||
// adViewHolder.mStopButton.setVisibility(View.GONE);
|
||
// adViewHolder.mRemoveButton.setVisibility(View.GONE);
|
||
break;
|
||
case TTAdConstant.INTERACTION_TYPE_LANDING_PAGE:
|
||
case TTAdConstant.INTERACTION_TYPE_BROWSER:
|
||
// adCreativeButton.setVisibility(View.GONE);
|
||
adCreativeButton.setVisibility(View.VISIBLE);
|
||
adCreativeButton.setText("查看详情");
|
||
// adViewHolder.mStopButton.setVisibility(View.GONE);
|
||
// adViewHolder.mRemoveButton.setVisibility(View.GONE);
|
||
break;
|
||
default:
|
||
adCreativeButton.setVisibility(View.GONE);
|
||
// adViewHolder.mStopButton.setVisibility(View.GONE);
|
||
// adViewHolder.mRemoveButton.setVisibility(View.GONE);
|
||
// TToast.show(mContext, "交互类型异常");
|
||
}
|
||
}
|
||
|
||
private void bindDownLoadStatusController(AdViewHolder adViewHolder, final TTFeedAd ad) {
|
||
final DownloadStatusController controller = ad.getDownloadStatusController();
|
||
/* adViewHolder.mStopButton.setOnClickListener(new View.OnClickListener() {
|
||
@Override
|
||
public void onClick(View v) {
|
||
if (controller != null) {
|
||
controller.changeDownloadStatus();
|
||
// TToast.show(mContext, "改变下载状态");
|
||
Log.d(TAG, "改变下载状态");
|
||
}
|
||
}
|
||
});
|
||
|
||
adViewHolder.mRemoveButton.setOnClickListener(new View.OnClickListener() {
|
||
@Override
|
||
public void onClick(View v) {
|
||
if (controller != null) {
|
||
controller.cancelDownload();
|
||
// TToast.show(mContext, "取消下载");
|
||
Log.d(TAG, "取消下载");
|
||
}
|
||
}
|
||
});*/
|
||
}
|
||
|
||
private void bindDownloadListener(final Button adCreativeButton, final AdViewHolder adViewHolder, TTFeedAd ad) {
|
||
TTAppDownloadListener downloadListener = new TTAppDownloadListener() {
|
||
@Override
|
||
public void onIdle() {
|
||
if (!isValid()) {
|
||
return;
|
||
}
|
||
adCreativeButton.setText("开始下载");
|
||
// adViewHolder.mStopButton.setText("开始下载");
|
||
}
|
||
|
||
@SuppressLint("SetTextI18n")
|
||
@Override
|
||
public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
|
||
if (!isValid()) {
|
||
return;
|
||
}
|
||
if (totalBytes <= 0L) {
|
||
adCreativeButton.setText("下载中 percent: 0");
|
||
} else {
|
||
adCreativeButton.setText("下载中 percent: " + (currBytes * 100 / totalBytes));
|
||
}
|
||
// adViewHolder.mStopButton.setText("下载中");
|
||
}
|
||
|
||
@SuppressLint("SetTextI18n")
|
||
@Override
|
||
public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
|
||
if (!isValid()) {
|
||
return;
|
||
}
|
||
if (totalBytes <= 0L) {
|
||
adCreativeButton.setText("下载中 percent: 0");
|
||
} else {
|
||
adCreativeButton.setText("下载暂停 percent: " + (currBytes * 100 / totalBytes));
|
||
}
|
||
// adViewHolder.mStopButton.setText("下载暂停");
|
||
}
|
||
|
||
@Override
|
||
public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
|
||
if (!isValid()) {
|
||
return;
|
||
}
|
||
adCreativeButton.setText("重新下载");
|
||
// adViewHolder.mStopButton.setText("重新下载");
|
||
}
|
||
|
||
@Override
|
||
public void onInstalled(String fileName, String appName) {
|
||
if (!isValid()) {
|
||
return;
|
||
}
|
||
adCreativeButton.setText("点击打开");
|
||
// adViewHolder.mStopButton.setText("点击打开");
|
||
}
|
||
|
||
@Override
|
||
public void onDownloadFinished(long totalBytes, String fileName, String appName) {
|
||
if (!isValid()) {
|
||
return;
|
||
}
|
||
adCreativeButton.setText("点击安装");
|
||
// adViewHolder.mStopButton.setText("点击安装");
|
||
}
|
||
|
||
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
|
||
private boolean isValid() {
|
||
return mTTAppDownloadListenerMap.get(adViewHolder) == this;
|
||
}
|
||
};
|
||
//一个ViewHolder对应一个downloadListener, isValid判断当前ViewHolder绑定的listener是不是自己
|
||
ad.setDownloadListener(downloadListener); // 注册下载监听器
|
||
mTTAppDownloadListenerMap.put(adViewHolder, downloadListener);
|
||
}
|
||
|
||
}
|