Files
assistant-android/app/src/main/java/com/gh/gamecenter/gamedetail/FuLiAdapter.java

579 lines
23 KiB
Java

package com.gh.gamecenter.gamedetail;
import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.Html;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.gh.base.OnListClickListener;
import com.gh.common.constant.Config;
import com.gh.common.util.LibaoUtils;
import com.gh.common.util.NewsUtils;
import com.gh.common.util.UrlFilterUtils;
import com.gh.common.view.GridDivider;
import com.gh.common.view.MarqueeView;
import com.gh.gamecenter.R;
import com.gh.gamecenter.SuggestionActivity;
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameDetailFuLiViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameDetailKaiFuViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameDetailLibaoViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameDetailNewsViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameDetailNoticeViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameDetailPluginViewHolder;
import com.gh.gamecenter.adapter.viewholder.ReuseViewHolder;
import com.gh.gamecenter.databinding.GamedetailItemKaifuBinding;
import com.gh.gamecenter.entity.GameDetailContact;
import com.gh.gamecenter.entity.GameDetailEntity;
import com.gh.gamecenter.entity.GameDetailServer;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.LibaoEntity;
import com.gh.gamecenter.entity.LibaoStatusEntity;
import com.gh.gamecenter.entity.NewsEntity;
import com.gh.gamecenter.entity.ToolBoxEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.adapter.BaseRecyclerAdapter;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import retrofit2.HttpException;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by khy on 2017/3/27.
* 游戏详情 - 福利适配器
*/
public class FuLiAdapter extends BaseRecyclerAdapter<ViewHolder> {
private OnListClickListener mListListener;
private List<LibaoEntity> mLibaoList;
private List<ToolBoxEntity> mToolBoxList;
private GameDetailEntity mGameDetailEntity;
private GameEntity mGameEntity;
private int position_news = -1;
private int position_tools = -1;
private int position_fuli = -1;
private int position_libao = -1;
private int position_kaifu = -1;
private int position_notice = -1;
private boolean isOpenLiBaoList;
private boolean isOpenToolList;
private boolean mIsPageEmpty;
public FuLiAdapter(Context context, String entrance, GameEntity gameEntity,
GameDetailEntity detailEntity, OnListClickListener listener) {
super(context);
this.mListListener = listener;
isOpenLiBaoList = false;
mToolBoxList = new ArrayList<>();
mGameDetailEntity = detailEntity;
mGameEntity = gameEntity;
if (mGameEntity != null) {
initPosition();
getToolTox();
getGameNews();
addLibaoList();
}
}
private void initPosition() {
if (mGameDetailEntity == null) {
return;
}
GameDetailContact contact = mGameDetailEntity.getContact();
if (mGameDetailEntity.getNotice() != null && mGameDetailEntity.getNotice().size() > 0) {
position_notice = 0;
}
if (mGameDetailEntity.getNews() != null
&& mGameDetailEntity.getNews().size() != 0) {
if (position_notice != -1) {
position_news = position_notice + 1;
} else {
position_news = 0;
}
}
if (!TextUtils.isEmpty(mGameDetailEntity.getFulishuoming())
|| contact != null && (contact.getService() != null && !TextUtils.isEmpty(contact.getService().getDes())
|| contact.getPlayer() != null && !TextUtils.isEmpty(contact.getService().getDes()))) {
if (position_news != -1) {
position_fuli = position_news + 1;
} else if (position_notice != -1) {
position_fuli = position_notice + 1;
} else {
position_fuli = 0;
}
}
if (mToolBoxList != null && mToolBoxList.size() > 0) {
if (position_fuli != -1) {
position_tools = position_fuli + 1;
} else if (position_news != -1) {
position_tools = position_news + 1;
} else if (position_notice != -1) {
position_tools = position_notice + 1;
} else {
position_tools = 0;
}
}
if (mLibaoList != null && mLibaoList.size() > 0) {
if (position_fuli != -1) {
position_libao = position_fuli + 1;
} else if (position_tools != -1) {
position_libao = position_tools + 1;
} else if (position_news != -1) {
position_libao = position_news + 1;
} else if (position_notice != -1) {
position_libao = position_notice + 1;
} else {
position_libao = 0;
}
}
if (checkServerData()) {
if (position_libao != -1) {
position_kaifu = position_libao + 1;
} else if (position_fuli != -1) {
position_kaifu = position_fuli + 1;
} else if (position_tools != -1) {
position_kaifu = position_tools + 1;
} else if (position_news != -1) {
position_kaifu = position_news + 1;
} else if (position_notice != -1) {
position_kaifu = position_notice + 1;
} else {
position_kaifu = 0;
}
}
if (position_kaifu != -1) {
int index = 0;
if (position_news != -1) {
index++;
}
if (position_tools != -1) {
index++;
}
if (position_libao != -1) {
index++;
}
if (position_fuli != -1) {
index++;
}
if (index >= 2) {
EventBus.getDefault().post(new EBReuse("canShowKaifuHint"));
}
}
}
// 检查开服信息, 防止开服信息都是上一个月以前的,造成开服日历空白的问题
private boolean checkServerData() {
if (mGameDetailEntity.getServerEntity() == null || mGameDetailEntity.getServerEntity().getCalendar() == null
|| mGameDetailEntity.getServerEntity().getCalendar().size() == 0) {
return false;
}
return true; // 如果有开服信息就显示 不做时间过滤了
}
private void getToolTox() {
RetrofitManager.getInstance(mContext)
.getApi()
.getGameToolBoxData(1, UrlFilterUtils.getFilterQuery("game_id", mGameEntity.getId()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<ToolBoxEntity>>() {
@Override
public void onResponse(List<ToolBoxEntity> response) {
super.onResponse(response);
mToolBoxList = response;
initPosition();
notifyDataSetChanged();
}
});
}
// 获取游戏新闻
private void getGameNews() {
RetrofitManager.getInstance(mContext).getApi()
.getGameNews(UrlFilterUtils.getFilterQuery("game_id", mGameEntity.getId()), 3, 1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<NewsEntity>>() {
@Override
public void onResponse(List<NewsEntity> response) {
Config.filterPluginArticle(response);
GameDetailContact contact = mGameDetailEntity.getContact();
if (!mGameEntity.isLibaoExists() && response.size() == 0
&& TextUtils.isEmpty(mGameDetailEntity.getFulishuoming())
&& (mGameDetailEntity.getServerEntity() == null
|| (mGameDetailEntity.getServerEntity().getCalendar() != null
&& mGameDetailEntity.getServerEntity().getCalendar().size() == 0))
&& (contact == null || (TextUtils.isEmpty(contact.getPlayer().getKey())
&& TextUtils.isEmpty(contact.getService().getQq())))) { // 判断当前页面内容是否内容
mIsPageEmpty = true;
notifyDataSetChanged(); // 空白页面提示
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
EventBus.getDefault().post(new EBReuse(GameDetailFragment.SKIP_XINXI));
}
}, 500);
}
mGameDetailEntity.setNews(response);
initPosition();
notifyDataSetChanged();
}
@Override
public void onFailure(HttpException e) {
initPosition();
notifyDataSetChanged();
}
});
}
private void addLibaoList() {
if (mGameEntity == null) return;
RetrofitManager.getInstance(mContext).getApi()
.getLibaoByGame(UrlFilterUtils.getFilterQuery("game_id", mGameEntity.getId()), 1, 128)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<LibaoEntity>>() {
@Override
public void onResponse(List<LibaoEntity> response) {
getLibaoStatus(response);
}
});
}
//获取礼包状态
private void getLibaoStatus(final List<LibaoEntity> response) {
StringBuilder builder = new StringBuilder();
for (int i = 0, size = response.size(); i < size; i++) {
builder.append(response.get(i).getId());
builder.append("-");
}
if (builder.length() == 0) {
return;
}
builder.deleteCharAt(builder.length() - 1);
String ids = builder.toString();
RetrofitManager.getInstance(mContext).getApi().getLibaoStatus(UrlFilterUtils.getFilterQuery("libao_ids", ids))
.map(new Func1<List<LibaoStatusEntity>, Object>() {
@Override
public Object call(List<LibaoStatusEntity> list) {
LibaoUtils.initLiBaoEntity(list, response);
if (response.size() != 0) {
mLibaoList = response;
initPosition();
}
return null;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<Object>() {
@Override
public void onResponse(Object response) {
super.onResponse(response);
notifyDataSetChanged();
}
});
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case 1:
view = mLayoutInflater.inflate(R.layout.gamedetail_item_notice, parent, false);
return new GameDetailNoticeViewHolder(view, mListListener);
case 2:
view = mLayoutInflater.inflate(R.layout.gamedetail_item_news, parent, false);
return new GameDetailNewsViewHolder(view, mListListener);
case 3:
view = mLayoutInflater.inflate(R.layout.gamedetail_item_fuli, parent, false);
return new GameDetailFuLiViewHolder(view, mListListener);
case 4:
view = mLayoutInflater.inflate(R.layout.gamedetail_item_libao_rv, parent, false);
return new GameDetailLibaoViewHolder(view);
case 5:
view = mLayoutInflater.inflate(R.layout.gamedetail_item_kaifu, parent, false);
return new GameDetailKaiFuViewHolder(GamedetailItemKaifuBinding.bind(view), mListListener);
case 6:
view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false);
return new FooterViewHolder(view);
case 7:
view = mLayoutInflater.inflate(R.layout.reuse_none_data, parent, false);
LinearLayout content = (LinearLayout) view.findViewById(R.id.reuse_none_data);
content.setVisibility(View.VISIBLE);
return new ReuseViewHolder(view);
case 8:
view = mLayoutInflater.inflate(R.layout.gamedetail_item_plugin, parent, false);
return new GameDetailPluginViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof GameDetailNoticeViewHolder) {
GameDetailNoticeViewHolder viewHolder = (GameDetailNoticeViewHolder) holder;
viewHolder.setClickData(mGameDetailEntity);
initNoticeViewHolder(viewHolder.mvNotice);
} else if (holder instanceof GameDetailNewsViewHolder) {
initNewsViewHolder((GameDetailNewsViewHolder) holder);
} else if (holder instanceof GameDetailPluginViewHolder) { // 工具item
GameDetailPluginViewHolder viewHolder = (GameDetailPluginViewHolder) holder;
initToolsViewHolder(viewHolder, position);
} else if (holder instanceof GameDetailLibaoViewHolder) {
GameDetailLibaoViewHolder viewHolder = (GameDetailLibaoViewHolder) holder;
initLibaoViewHolder(viewHolder);
} else if (holder instanceof GameDetailFuLiViewHolder) {
GameDetailFuLiViewHolder viewHolder = (GameDetailFuLiViewHolder) holder;
initFuLiViewHolder(viewHolder);
} else if (holder instanceof GameDetailKaiFuViewHolder) {
GameDetailKaiFuViewHolder viewHolder = (GameDetailKaiFuViewHolder) holder;
initKaiFuViewHolder(viewHolder);
} else if (holder instanceof ReuseViewHolder) {
} else if (holder instanceof FooterViewHolder) {
FooterViewHolder viewHolder = (FooterViewHolder) holder;
viewHolder.loading.setVisibility(View.GONE);
viewHolder.hint.setText(R.string.game_suggestion_hint);
viewHolder.initItemPadding();
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SuggestionActivity.startSuggestionActivity(mContext, 4, "game", mGameEntity.getName() + ",问题反馈:");
}
});
}
}
@Override
public int getItemViewType(int position) {
if (position_notice != -1 && position_notice == position) {
return 1;
} else if (position_tools != -1 && position_tools == position) {
return 8;
} else if (position_news != -1 && position_news == position) {
return 2;
} else if (position_fuli != -1 && position_fuli == position) {
return 3;
} else if (position_libao != -1 && position_libao == position) {
return 4;
} else if (position_kaifu != -1 && position_kaifu == position) {
return 5;
} else if (position == getItemCount() - 1 && getItemCount() == 1) {
return 7;
} else if (position == getItemCount() - 1) {
return 6;
}
return position;
}
@Override
public int getItemCount() {
int index = 0;
if (position_notice != -1) {
index++;
}
if (position_news != -1) {
index++;
}
if (position_fuli != -1) {
index++;
}
if (position_libao != -1) {
index++;
}
if (position_kaifu != -1) {
index++;
}
if (position_tools != -1) {
index++;
}
if (index != 0 || mIsPageEmpty) {
index++;
}
return index;
}
private void initNoticeViewHolder(final MarqueeView mvNotice) {
final List<NewsEntity> notice = mGameDetailEntity.getNotice();
if (notice != null && notice.size() > 0) {
List<String> list = new ArrayList<>();
for (NewsEntity newsEntity : notice) {
list.add(newsEntity.getTitle());
}
mvNotice.startWithList(list);
} else {
mvNotice.setVisibility(View.GONE);
}
}
private void initToolsViewHolder(GameDetailPluginViewHolder viewHolder, final int position) {
viewHolder.gameDetailPluginRv.setNestedScrollingEnabled(false);
if (isOpenToolList || mToolBoxList.size() <= 3) {
viewHolder.gamedetailPluginOpen.setVisibility(View.GONE);
}
viewHolder.gamedetailPluginTitle.setText("游戏工具");
viewHolder.gameDetailPluginRv.setLayoutManager(new LinearLayoutManager(mContext));
final GameDetailToolsAdapter adapter = new GameDetailToolsAdapter(mContext, mToolBoxList, isOpenToolList);
viewHolder.gameDetailPluginRv.setAdapter(adapter);
viewHolder.gamedetailPluginOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isOpenToolList = true;
adapter.notifyDataSetChanged();
notifyItemChanged(position);
}
});
}
private void initNewsViewHolder(GameDetailNewsViewHolder viewHolder) {
viewHolder.setClickData(mGameDetailEntity);
if (mGameDetailEntity.getNews().size() < 3) {
viewHolder.newsMore.setVisibility(View.GONE);
} else {
viewHolder.newsMore.setVisibility(View.VISIBLE);
}
final List<NewsEntity> newsList = mGameDetailEntity.getNews();
for (int i = 0; i < newsList.size(); i++) {
NewsEntity newsEntity = newsList.get(i);
switch (i) {
case 0:
viewHolder.newItemLine1.setVisibility(View.VISIBLE);
viewHolder.newsItem1.setVisibility(View.VISIBLE);
viewHolder.newsTitle1.setText(newsEntity.getTitle());
NewsUtils.setNewsType(viewHolder.newsType1, newsEntity.getType(), 0, 0);
break;
case 1:
viewHolder.newItemLine2.setVisibility(View.VISIBLE);
viewHolder.newsItem2.setVisibility(View.VISIBLE);
viewHolder.newsTitle2.setText(newsEntity.getTitle());
NewsUtils.setNewsType(viewHolder.newsType2, newsEntity.getType(), 0, 0);
break;
case 2:
viewHolder.newItemLine3.setVisibility(View.VISIBLE);
viewHolder.newsItem3.setVisibility(View.VISIBLE);
viewHolder.newsTitle3.setText(newsEntity.getTitle());
NewsUtils.setNewsType(viewHolder.newsType3, newsEntity.getType(), 0, 0);
break;
}
}
}
private void initLibaoViewHolder(GameDetailLibaoViewHolder viewHolder) {
viewHolder.libaoRv.setNestedScrollingEnabled(false);
if (mLibaoList != null && (mLibaoList.size() <= 3 || isOpenLiBaoList)) {
viewHolder.openList.setVisibility(View.GONE);
} else {
viewHolder.openList.setVisibility(View.VISIBLE);
}
viewHolder.libaoRv.setLayoutManager(new LinearLayoutManager(mContext));
viewHolder.libaoRv.setAdapter(new GameLibaoGalleryAdapter(mContext, mLibaoList, isOpenLiBaoList, mListListener));
viewHolder.openList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isOpenLiBaoList = true;
notifyItemChanged(position_libao);
}
});
}
private void initFuLiViewHolder(final GameDetailFuLiViewHolder viewHolder) {
viewHolder.setClickData(mGameDetailEntity);
final GameDetailContact contact = mGameDetailEntity.getContact();
if (contact != null && contact.getService() != null && !TextUtils.isEmpty(contact.getService().getDes())) {
viewHolder.fuliQqRl.setVisibility(View.VISIBLE);
viewHolder.fuliQqDes.setText(contact.getService().getDes());
} else {
viewHolder.fuliQqRl.setVisibility(View.GONE);
}
if (contact != null && contact.getPlayer() != null && !TextUtils.isEmpty(contact.getPlayer().getDes())) {
viewHolder.fuliQqunRl.setVisibility(View.VISIBLE);
viewHolder.fuliQqunDes.setText(contact.getPlayer().getDes());
} else {
viewHolder.fuliQqunRl.setVisibility(View.GONE);
}
if (TextUtils.isEmpty(mGameDetailEntity.getFulishuoming())) {
viewHolder.fuliDes.setVisibility(View.GONE);
} else {
viewHolder.fuliDes.setVisibility(View.VISIBLE);
viewHolder.fuliDes.setText(Html.fromHtml(mGameDetailEntity.getFulishuoming()));
}
viewHolder.filiNoticeLl.setVisibility(View.GONE);
}
private void initKaiFuViewHolder(GameDetailKaiFuViewHolder viewHolder) {
viewHolder.setClickData(mGameDetailEntity);
GameDetailServer serverEntity = mGameDetailEntity.getServerEntity();
GamedetailItemKaifuBinding binding = viewHolder.binding;
if (!TextUtils.isEmpty(serverEntity.getDes())) {
binding.kaifuDes.setVisibility(View.VISIBLE);
binding.kaifuDes.setText(Html.fromHtml(serverEntity.getDes()));
} else {
binding.kaifuDes.setVisibility(View.GONE);
}
GameDetailKaiFuAdapter adapter = new GameDetailKaiFuAdapter(mContext, serverEntity.getCalendar(), binding, mGameEntity, mGameDetailEntity.getMe());
binding.kaifuRv.setNestedScrollingEnabled(false);
binding.kaifuRv.setLayoutManager(new GridLayoutManager(mContext, 7));
binding.kaifuRv.addItemDecoration(new GridDivider(mContext, 1, 7, Color.BLACK));
binding.kaifuRv.setAdapter(adapter);
adapter.showKaiFuDetail(false);
}
}