package com.chaychan.news.ui.adapter;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chaychan.adapter.MultipleItemRvAdapter;
import com.chaychan.news.model.entity.News;
import com.chaychan.news.ui.adapter.provider.news.CenterPicNewsItemProvider;
import com.chaychan.news.ui.adapter.provider.news.RightPicNewsItemProvider;
import com.chaychan.news.ui.adapter.provider.news.TextNewsItemProvider;
import com.chaychan.news.ui.adapter.provider.news.ThreePicNewsItemProvider;
import com.chaychan.news.utils.ListUtils;
import java.util.List;
/**
* @author ChayChan
* @description: 新闻列表的适配器
* @date 2018/3/22 11
*/
public class NewsListAdapter extends MultipleItemRvAdapter<News,BaseViewHolder> {
/**
* 纯文字布局(文章、广告)
*/
public static final int TEXT_NEWS = 100;
/**
* 居中大图布局(1.单图文章;2.单图广告;3.视频,中间显示播放图标,右侧显示时长)
*/
public static final int CENTER_SINGLE_PIC_NEWS = 200;
/**
* 右侧小图布局(1.小图新闻;2.视频类型,右下角显示视频时长)
*/
public static final int RIGHT_PIC_VIDEO_NEWS = 300;
/**
* 三张图片布局(文章、广告)
*/
public static final int THREE_PICS_NEWS = 400;
private String mChannelCode;
public NewsListAdapter(String channelCode, @Nullable List<News> data) {
super(data);
mChannelCode = channelCode;
//构造函数若有传参可以在调用finishInitialize()之前进行赋值,赋值给全局变量
//这样getViewType()和registerItemProvider()方法中可以获取到传过来的值
//getViewType()中可能因为某些业务逻辑,需要将某个值传递过来进行判断,返回对应的viewType
//registerItemProvider()中可以将值传递给ItemProvider
//最重要的是这一行,别忘加了!!
finishInitialize();//调用该方法告知MultipleItemRvAdapter1️已初始化完构造函数参数的传递
}
@Override
protected int getViewType(News news) {
if (news.has_video) {
//如果有视频
if (news.video_style == 0) {
//右侧视频
if (news.middle_image == null || TextUtils.isEmpty(news.middle_image.url)) {
return TEXT_NEWS;
}
return RIGHT_PIC_VIDEO_NEWS;
} else if (news.video_style == 2) {
//居中视频
return CENTER_SINGLE_PIC_NEWS;
}
} else {
//非视频新闻
if (!news.has_image) {
//纯文字新闻
return TEXT_NEWS;
} else {
if (ListUtils.isEmpty(news.image_list)) {
//图片列表为空,则是右侧图片
return RIGHT_PIC_VIDEO_NEWS;
}
if (news.gallary_image_count == 3) {
//图片数为3,则为三图
return THREE_PICS_NEWS;
}
//中间大图,右下角显示图数
return CENTER_SINGLE_PIC_NEWS;
}
}
return TEXT_NEWS;
}
@Override
public void registerItemProvider() {
//注册itemProvider
mProviderDelegate.registerProvider(new TextNewsItemProvider(mChannelCode));
mProviderDelegate.registerProvider(new CenterPicNewsItemProvider(mChannelCode));
mProviderDelegate.registerProvider(new RightPicNewsItemProvider(mChannelCode));
mProviderDelegate.registerProvider(new ThreePicNewsItemProvider(mChannelCode));
}
}
package com.chaychan.news.ui.adapter.provider.news;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chaychan.news.R;
import com.chaychan.news.model.entity.News;
import com.chaychan.news.ui.adapter.NewsListAdapter;
/**
* @author ChayChan
* @description: 纯文本新闻
* @date 2018/3/22 14:36
*/
public class TextNewsItemProvider extends BaseNewsItemProvider {
public TextNewsItemProvider(String channelCode) {
super(channelCode);
}
@Override
public int viewType() {
return NewsListAdapter.TEXT_NEWS;
}
@Override
public int layout() {
return R.layout.item_text_news;
}
@Override
protected void setData(BaseViewHolder helper, News news) {
//由于文本消息的逻辑目前已经在基类中封装,所以此处无须写
//定义此类是提供文本消息的ItemProvider
}
}
package com.chaychan.news.ui.adapter.provider.news;
import android.widget.TextView;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chaychan.news.R;
import com.chaychan.news.model.entity.News;
import com.chaychan.news.ui.adapter.NewsListAdapter;
import com.chaychan.news.utils.GlideUtils;
import com.chaychan.news.utils.TimeUtils;
import com.chaychan.news.utils.UIUtils;
/**
* @author ChayChan
* @description: 居中大图布局(1.单图文章;2.单图广告;3.视频,中间显示播放图标,右侧显示时长)
* @date 2018/3/22 14:36
*/
public class CenterPicNewsItemProvider extends BaseNewsItemProvider {
public CenterPicNewsItemProvider(String channelCode) {
super(channelCode);
}
@Override
public int viewType() {
return NewsListAdapter.CENTER_SINGLE_PIC_NEWS;
}
@Override
public int layout() {
return R.layout.item_center_pic_news;
}
@Override
protected void setData(BaseViewHolder helper, News news) {
//中间大图布局,判断是否有视频
TextView tvBottomRight = helper.getView(R.id.tv_bottom_right);
if (news.has_video) {
helper.setVisible(R.id.iv_play, true);//显示播放按钮
tvBottomRight.setCompoundDrawables(null, null, null, null);//去除TextView左侧图标
helper.setText(R.id.tv_bottom_right, TimeUtils.secToTime(news.video_duration));//设置时长
GlideUtils.load(mContext, news.video_detail_info.detail_video_large_image.url, helper.getView(R.id.iv_img));//中间图片使用视频大图
} else {
helper.setVisible(R.id.iv_play, false);//隐藏播放按钮
if (news.gallary_image_count == 1){
tvBottomRight.setCompoundDrawables(null, null, null, null);//去除TextView左侧图标
}else{
tvBottomRight.setCompoundDrawables(mContext.getResources().getDrawable(R.mipmap.icon_picture_group), null, null, null);//TextView增加左侧图标
helper.setText(R.id.tv_bottom_right, news.gallary_image_count + UIUtils.getString(R.string.img_unit));//设置图片数
}
GlideUtils.load(mContext, news.image_list.get(0).url.replace("list/300x196", "large"), helper.getView(R.id.iv_img));//中间图片使用image_list第一张
}
}
}
package com.chaychan.news.ui.adapter.provider.news;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chaychan.news.R;
import com.chaychan.news.model.entity.News;
import com.chaychan.news.ui.adapter.NewsListAdapter;
import com.chaychan.news.utils.GlideUtils;
import com.chaychan.news.utils.TimeUtils;
/**
* @author ChayChan
* @description: 右侧小图布局(1.小图新闻;2.视频类型,右下角显示视频时长)
* @date 2018/3/22 14:36
*/
public class RightPicNewsItemProvider extends BaseNewsItemProvider {
public RightPicNewsItemProvider(String channelCode) {
super(channelCode);
}
@Override
public int viewType() {
return NewsListAdapter.RIGHT_PIC_VIDEO_NEWS;
}
@Override
public int layout() {
return R.layout.item_pic_video_news;
}
@Override
protected void setData(BaseViewHolder helper, News news) {
//右侧小图布局,判断是否有视频
if (news.has_video) {
helper.setVisible(R.id.ll_duration, true);//显示时长
helper.setText(R.id.tv_duration, TimeUtils.secToTime(news.video_duration));//设置时长
} else {
helper.setVisible(R.id.ll_duration, false);//隐藏时长
}
GlideUtils.load(mContext, news.middle_image.url, helper.getView(R.id.iv_img));//右侧图片或视频的图片使用middle_image
}
}
package com.chaychan.news.ui.adapter.provider.news;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chaychan.news.R;
import com.chaychan.news.model.entity.News;
import com.chaychan.news.ui.adapter.NewsListAdapter;
import com.chaychan.news.utils.GlideUtils;
/**
* @author ChayChan
* @description: 三张图片布局(文章、广告)
* @date 2018/3/22 14:36
*/
public class ThreePicNewsItemProvider extends BaseNewsItemProvider {
public ThreePicNewsItemProvider(String channelCode) {
super(channelCode);
}
@Override
public int viewType() {
return NewsListAdapter.THREE_PICS_NEWS;
}
@Override
public int layout() {
return R.layout.item_three_pics_news;
}
@Override
protected void setData(BaseViewHolder helper, News news) {
//三张图片的新闻
GlideUtils.load(mContext, news.image_list.get(0).url, helper.getView(R.id.iv_img1));
GlideUtils.load(mContext, news.image_list.get(1).url, helper.getView(R.id.iv_img2));
GlideUtils.load(mContext, news.image_list.get(2).url, helper.getView(R.id.iv_img3));
}
}
package com.chaychan.news.ui.adapter.provider.news;
import android.text.TextUtils;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chaychan.adapter.BaseItemProvider;
import com.chaychan.news.R;
import com.chaychan.news.constants.Constant;
import com.chaychan.news.model.entity.News;
import com.chaychan.news.utils.TimeUtils;
import com.chaychan.news.utils.UIUtils;
/**
* @author ChayChan
* @description: 将新闻中设置数据公共部分抽取
* @date 2018/3/22 14:48
*/
public abstract class BaseNewsItemProvider extends BaseItemProvider<News,BaseViewHolder> {
private String mChannelCode;
public BaseNewsItemProvider(String channelCode) {
mChannelCode = channelCode;
}
@Override
public void convert(BaseViewHolder helper, News news, int i) {
if (TextUtils.isEmpty(news.title)) {
//如果没有标题,则直接跳过
return;
}
//设置标题、底部作者、评论数、发表时间
helper.setText(R.id.tv_title, news.title)
.setText(R.id.tv_author, news.source)
.setText(R.id.tv_comment_num, news.comment_count + UIUtils.getString(R.string.comment))
.setText(R.id.tv_time, TimeUtils.getShortTime(news.behot_time * 1000));
//根据情况显示置顶、广告和热点的标签
int position = helper.getAdapterPosition();
String[] channelCodes = UIUtils.getStringArr(R.array.channel_code);
boolean isTop = position == 0 && mChannelCode.equals(channelCodes[0]); //属于置顶
boolean isHot = news.hot == 1;//属于热点新闻
boolean isAD = !TextUtils.isEmpty(news.tag) ? news.tag.equals(Constant.ARTICLE_GENRE_AD) : false;//属于广告新闻
boolean isMovie = !TextUtils.isEmpty(news.tag) ? news.tag.equals(Constant.TAG_MOVIE) : false;//如果是影视
helper.setVisible(R.id.tv_tag, isTop || isHot || isAD);//如果是上面任意一个,显示标签
helper.setVisible(R.id.tv_comment_num, !isAD);//如果是广告,则隐藏评论数
String tag = "";
if (isTop) {
tag = UIUtils.getString(R.string.to_top);
helper.setTextColor(R.id.tv_tag, UIUtils.getColor(R.color.color_F96B6B));
} else if (isHot) {
tag = UIUtils.getString(R.string.hot);
helper.setTextColor(R.id.tv_tag, UIUtils.getColor(R.color.color_F96B6B));
} else if (isAD) {
tag = UIUtils.getString(R.string.ad);
helper.setTextColor(R.id.tv_tag, UIUtils.getColor(R.color.color_3091D8));
} else if (isMovie) {
//如果是影视
tag = UIUtils.getString(R.string.tag_movie);
helper.setTextColor(R.id.tv_tag, UIUtils.getColor(R.color.color_F96B6B));
}
helper.setText(R.id.tv_tag, tag);
setData(helper, news);
}
protected abstract void setData(BaseViewHolder helper, News news);
}