新开服表(默认定位未完成,等待根据游戏id获取开服信息接口)

This commit is contained in:
kehaoyuan
2017-08-20 17:47:53 +08:00
parent 043eebf013
commit 4966d85634
27 changed files with 1471 additions and 1297 deletions

View File

@ -116,7 +116,7 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
@Override
public void onResume() {
super.onResume();
isEverPause = false;
isEverPause = false; // TODO 导致根据isEverPause判断的方法无法执行
}
@Override

View File

@ -236,13 +236,13 @@ public class GameDetailActivity extends BaseActivity {
mKaifuHint.setVisibility(View.VISIBLE);
}
mTanBarFuLiTv.setTextColor(Color.WHITE);
mTanBarFuLiTv.setBackgroundResource(R.drawable.gamedetail_tag_select_bg);
mTanBarFuLiTv.setBackgroundResource(R.drawable.tabbar_left_bg);
mTanBarXinXiTv.setTextColor(Color.BLACK);
mTanBarXinXiTv.setBackgroundDrawable(new ColorDrawable(0));
} else {
mKaifuHint.setVisibility(View.GONE);
mTanBarXinXiTv.setTextColor(Color.WHITE);
mTanBarXinXiTv.setBackgroundResource(R.drawable.gamedetail_tag_unselect_bg);
mTanBarXinXiTv.setBackgroundResource(R.drawable.tabbar_right_bg);
mTanBarFuLiTv.setTextColor(Color.BLACK);
mTanBarFuLiTv.setBackgroundDrawable(new ColorDrawable(0));
}

View File

@ -1,111 +1,43 @@
package com.gh.gamecenter;
import android.animation.Animator;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.gc.materialdesign.views.ProgressBarCircularIndeterminate;
import com.gh.base.BaseActivity;
import com.gh.base.OnRequestCallBackListener;
import com.gh.common.util.DownloadItemUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.view.VerticalItemDecoration;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.adapter.KaiFuAdapter;
import com.gh.gamecenter.adapter.KaiFuDialogAdapter;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.eventbus.EBDownloadStatus;
import com.gh.gamecenter.eventbus.EBNetworkState;
import com.gh.gamecenter.eventbus.EBPackage;
import com.jakewharton.rxbinding.view.RxView;
import com.lightgame.download.DataWatcher;
import com.lightgame.download.DownloadEntity;
import com.gh.gamecenter.eventbus.EBKaiFuReset;
import com.gh.gamecenter.kaifu.KaiFuFragment;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import butterknife.BindView;
import rx.functions.Action1;
/**
* Created by khy on 2017/3/16.
* 首页-开服表
* Created by khy on 18/08/17.
*/
public class KaiFuActivity extends BaseActivity implements OnRequestCallBackListener,
KaiFuDialogAdapter.OnKaiFuDialogCallBackListener, KaiFuAdapter.OnScrollToKaiFuIndexListener,
SwipeRefreshLayout.OnRefreshListener {
@BindView(R.id.kaifu_rv)
RecyclerView mRecyclerView;
@BindView(R.id.kaifu_pb)
ProgressBarCircularIndeterminate mPbLoading;
@BindView(R.id.kaifu_refresh)
SwipeRefreshLayout mRefreshLayout;
@BindView(R.id.kaifu_game_name)
TextView mGameName;
@BindView(R.id.popup_bg)
View mPopupBg;
@BindView(R.id.kaifu_select_game_rl)
RelativeLayout mSelectGameRl;
@BindView(R.id.reuse_no_connection)
LinearLayout mNoConnection;
@BindView(R.id.reuse_none_data)
LinearLayout mNoData;
private PopupWindow mPopupWindow;
public class KaiFuActivity extends BaseActivity {
private KaiFuAdapter mAdapter;
@BindView(R.id.reuse_actionbar)
RelativeLayout mReuseActionbar;
private LinearLayoutManager layoutManager;
private TextView mResetTv;
private boolean isEverpause = false;
private boolean move = false;
private boolean smoothMove = false;
private KaiFuFragment mKaiFuFragment;
private KaiFuFragment mGameKaiFuFragment;
private String kaifuType;
Runnable runnable = new Runnable() {
@Override
public void run() {
mAdapter = new KaiFuAdapter(KaiFuActivity.this, KaiFuActivity.this, KaiFuActivity.this, kaifuType);
mRecyclerView.setAdapter(mAdapter);
}
};
private int mDialogGamePosition; // 顶部弹窗过滤位置
private int kaifuOffset = 0;
private int mInitMovePosition; // 首次进入移动的位置
private int mMovePosition; // 移动位置
private DataWatcher dataWatcher = new DataWatcher() {
@Override
public void onDataChanged(DownloadEntity downloadEntity) {
ArrayList<Integer> locationList = mAdapter.getLocationMap().get(downloadEntity.getPackageName());
if (locationList != null) {
GameEntity gameEntity;
for (int location : locationList) {
gameEntity = mAdapter.getSubjectList().get(location - getGameEntityIndex());
if (gameEntity != null) {
DownloadItemUtils.processDate(KaiFuActivity.this, gameEntity, downloadEntity,
mAdapter, location);
}
}
}
}
};
public static final String SINGLE_GAME_KAIFU = "SINGLE_GAME_KAIFU";
public static final String ALL_GAME_KAIFU = "ALL_GAME_KAIFU";
@NonNull
public static Intent getIntent(Context context, String entrance) {
@ -114,373 +46,71 @@ public class KaiFuActivity extends BaseActivity implements OnRequestCallBackList
return intent;
}
@Override
protected int getLayoutId() {
return R.layout.activity_kaifu;
return R.layout.activity_kaifu2;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTitle(getString(R.string.title_kaifu));
initTitle("开服表");
kaifuType = "全部";
mRefreshLayout.setColorSchemeResources(R.color.theme);
mRefreshLayout.setOnRefreshListener(this);
mRefreshLayout.setEnabled(false);
mAdapter = new KaiFuAdapter(this, this, this, kaifuType);
layoutManager = new LinearLayoutManager(this);
((DefaultItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
mRecyclerView.addItemDecoration(new VerticalItemDecoration(this, 8, false));
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (smoothMove && newState == RecyclerView.SCROLL_STATE_IDLE) {
smoothMove = false;
int n = mMovePosition - layoutManager.findFirstVisibleItemPosition();
if (0 <= n && n < mRecyclerView.getChildCount()) {
View view = layoutManager.findViewByPosition(n);
if (view != null) {
int top = view.getTop();
mRecyclerView.smoothScrollBy(0, top);
}
}
}
//上拉加载
if (mAdapter.isLoadedBottom() && newState == RecyclerView.SCROLL_STATE_IDLE
&& mAdapter.getItemCount() == layoutManager.findLastVisibleItemPosition() + 1) {
mAdapter.initListBottom(kaifuOffset + mAdapter.loadCountBottom());
}
//下拉加载
if (kaifuOffset > 0 && mAdapter.isLoadedTop() && newState == RecyclerView.SCROLL_STATE_IDLE
&& layoutManager.findFirstVisibleItemPosition() == 0) {
int countTop = mAdapter.loadCountTop();
// if (countTop % 20 == 0) { // 不是20的倍数 证明加载完毕
int offset = kaifuOffset - countTop;
int limit = 20;
if (offset < 0) {
limit = limit + offset;
offset = 0;
}
if (limit == 0) return;
mAdapter.initListTop(offset, limit);
// }
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (move) {
move = false;
int n = mMovePosition - layoutManager.findFirstVisibleItemPosition();
if (0 <= n && n < mRecyclerView.getChildCount()) {
int top = mRecyclerView.getChildAt(n).getTop();
mRecyclerView.scrollBy(0, top);
}
}
}
});
mResetTv = new TextView(this);
mResetTv.setText("重置");
mResetTv.setTextColor(ContextCompat.getColor(this, R.color.title));
mResetTv.setGravity(Gravity.CENTER);
mResetTv.setVisibility(View.GONE);
mResetTv.setBackgroundResource(R.drawable.border_black_bg);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
DisplayUtils.dip2px(this, 48), DisplayUtils.dip2px(this, 28));
params.addRule(RelativeLayout.CENTER_VERTICAL);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.setMargins(0, 0, DisplayUtils.dip2px(this, 8), 0);
mReuseActionbar.addView(mResetTv, params);
// 防抖处理
RxView.clicks(mSelectGameRl)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
initSelectGameDialog();
}
});
mNoConnection.setOnClickListener(new View.OnClickListener() {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
mKaiFuFragment = new KaiFuFragment();
fragmentTransaction.add(R.id.layout_fragment_content, mKaiFuFragment);
fragmentTransaction.commit();
mResetTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.initKaiFuOffset();
mNoConnection.setVisibility(View.GONE);
mPbLoading.setVisibility(View.VISIBLE);
}
});
}
private void initSelectGameDialog() {
isShowPopupBg(true);
View contentView = View.inflate(this, R.layout.dialog_kaifu_select_game, null);
RecyclerView selectGameRv = (RecyclerView) contentView.findViewById(R.id.dialog_kaifu_select_game_rv);
final TextView selectGameTitle = (TextView) contentView.findViewById(R.id.dialog_kaifu_title);
final LinearLayoutManager layout = new LinearLayoutManager(this);
selectGameRv.setLayoutManager(layout);
selectGameRv.setAdapter(new KaiFuDialogAdapter(this, this, mDialogGamePosition));
mPopupWindow = new PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT
, LinearLayout.LayoutParams.MATCH_PARENT, true);
mPopupWindow.setAnimationStyle(R.style.scale_popwindow_anim_style);
mPopupWindow.showAtLocation(mSelectGameRl, 0, 0, 0);
selectGameRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (layout.findFirstVisibleItemPosition() >= 5) {
selectGameTitle.setVisibility(View.VISIBLE);
} else {
selectGameTitle.setVisibility(View.GONE);
}
}
});
selectGameRv.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0
&& mPopupWindow != null
&& mPopupWindow.isShowing()) {
isShowPopupBg(false);
}
return false;
}
});
contentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isShowPopupBg(false);
resetFragment();
}
});
}
private void moveToPosition(int n, boolean isSmooth) {
int firstItem = layoutManager.findFirstVisibleItemPosition();
int lastItem = layoutManager.findLastVisibleItemPosition();
if (n <= firstItem) {
if (isSmooth) {
mRecyclerView.smoothScrollToPosition(n);
} else {
mRecyclerView.scrollToPosition(n);
}
} else if (n <= lastItem) {
int top = layoutManager.findViewByPosition(n).getTop();
if (isSmooth) {
mRecyclerView.smoothScrollBy(0, top);
} else {
mRecyclerView.scrollBy(0, top);
}
} else {
if (isSmooth) {
mRecyclerView.smoothScrollToPosition(n);
smoothMove = true;
} else {
mRecyclerView.scrollToPosition(n);
move = true;
}
}
private void resetFragment() {
mResetTv.setVisibility(View.GONE);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.remove(mGameKaiFuFragment);
fragmentTransaction.show(mKaiFuFragment);
fragmentTransaction.commit();
}
public void isShowPopupBg(boolean isShow) {
if (isShow) {
mPopupBg.setVisibility(View.VISIBLE);
mPopupBg.animate()
.alpha(1f)
.setDuration(300)
.setListener(null);
} else {
mPopupWindow.dismiss();
mPopupBg.animate()
.alpha(0f)
.setDuration(300)
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
mPopupBg.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
}
@Override
public void onPause() {
super.onPause();
isEverpause = true;
DownloadManager.getInstance(getApplicationContext()).removeObserver(dataWatcher);
}
@Override
public void onResume() {
super.onResume();
if (isEverpause) {
for (GameEntity entity : mAdapter.getSubjectList()) {
entity.setEntryMap(DownloadManager.getInstance(this).getEntryMap(entity.getName()));
}
}
isEverpause = false;
DownloadManager.getInstance(getApplicationContext()).addObserver(dataWatcher);
}
@Override
public void loadDone() {
mNoData.setVisibility(View.GONE);
if (mPbLoading != null && mPbLoading.getVisibility() == View.VISIBLE) {
mPbLoading.setVisibility(View.GONE);
}
if (mRefreshLayout.isRefreshing()) {
mRefreshLayout.setRefreshing(false);
}
}
@Override
public void loadDone(Object obj) {
kaifuOffset = (int) obj;
}
@Override
public void loadError() {
if (mPbLoading != null && mPbLoading.getVisibility() == View.VISIBLE) {
mPbLoading.setVisibility(View.GONE);
}
toast("加载失败,请检查网络状态");
mPbLoading.setVisibility(View.GONE);
mNoData.setVisibility(View.GONE);
mNoConnection.setVisibility(View.VISIBLE);
}
@Override
public void loadEmpty() {
mNoData.setVisibility(View.VISIBLE);
mNoConnection.setVisibility(View.GONE);
}
@Override
public void selectPosition(int position, String tag, String gameName) {
mDialogGamePosition = position;
if (!TextUtils.isEmpty(gameName)) {
mGameName.setText(gameName);
} else {
mGameName.setText(tag);
}
isShowPopupBg(false);
kaifuOffset = 0;
kaifuType = tag;
mRecyclerView.setVisibility(View.VISIBLE);
mPbLoading.setVisibility(View.VISIBLE);
mNoConnection.setVisibility(View.GONE);
mNoData.setVisibility(View.GONE);
mAdapter = new KaiFuAdapter(this, this, this, kaifuType);
mRecyclerView.setAdapter(mAdapter);
}
// 下载被删除事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBDownloadStatus status) {
if ("delete".equals(status.getStatus())) {
DownloadManager.getInstance(this).removePlatform(status.getName(), status.getPlatform());
ArrayList<Integer> locationList = mAdapter.getLocationMap().get(status.getPackageName());
if (locationList != null) {
GameEntity gameEntity;
for (int location : locationList) {
gameEntity = mAdapter.getSubjectList().get(location - getGameEntityIndex());
if (gameEntity != null && gameEntity.getEntryMap() != null) {
gameEntity.getEntryMap().remove(status.getPlatform());
}
mAdapter.notifyItemChanged(location);
}
}
}
}
private int getGameEntityIndex() {
if (kaifuOffset != 0) {
return 1;
}
return 0;
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBPackage busFour) {
ArrayList<Integer> locationList = mAdapter.getLocationMap().get(busFour.getPackageName());
if (locationList != null) {
GameEntity gameEntity;
for (int location : locationList) {
if ("安装".equals(busFour.getType())) {
gameEntity = mAdapter.getSubjectList().get(location - getGameEntityIndex());
for (ApkEntity apkEntity : gameEntity.getApk()) {
if (apkEntity.getPackageName().equals(busFour.getPackageName())) {
if (gameEntity.getEntryMap() != null) {
gameEntity.getEntryMap().remove(apkEntity.getPlatform());
}
mAdapter.notifyItemChanged(location + getGameEntityIndex());
break;
}
}
} else if ("卸载".equals(busFour.getType())) {
mAdapter.notifyItemChanged(location + getGameEntityIndex());
}
}
public void onEventMainThread(EBKaiFuReset reset) {
if (SINGLE_GAME_KAIFU.equals(reset.getControl())) {
mResetTv.setVisibility(View.VISIBLE);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.hide(mKaiFuFragment);
Bundle args = new Bundle();
args.putString("gameId", reset.getGameId());
mGameKaiFuFragment = new KaiFuFragment();
mGameKaiFuFragment.setArguments(args);
fragmentTransaction.add(R.id.layout_fragment_content, mGameKaiFuFragment, KaiFuFragment.class.getSimpleName());
fragmentTransaction.commit();
} else if (ALL_GAME_KAIFU.equals(reset.getControl())) {
resetFragment();
}
}
//连接上网络事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBNetworkState busNetworkState) {
if (busNetworkState.isNetworkConnected()) {
if (mNoConnection.getVisibility() == View.VISIBLE) {
mRecyclerView.setVisibility(View.VISIBLE);
mPbLoading.setVisibility(View.VISIBLE);
mNoConnection.setVisibility(View.GONE);
mAdapter = new KaiFuAdapter(this, this, this, kaifuType);
mRecyclerView.setAdapter(mAdapter);
}
}
}
@Override
public void onScroll(int scrollPosition) {
mInitMovePosition = scrollPosition + getGameEntityIndex() + 1;
moveToPosition(mInitMovePosition, false);
}
@Override
public void onRefresh() {
mRecyclerView.postDelayed(runnable, 1000);
}
}

View File

@ -1,596 +0,0 @@
package com.gh.gamecenter.adapter;
import android.support.v4.util.ArrayMap;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.gh.base.OnRequestCallBackListener;
import com.gh.common.constant.ItemViewType;
import com.gh.common.util.ApkActiveUtils;
import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.DownloadItemUtils;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.KaiFuUtils;
import com.gh.common.util.StringUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.GameDetailActivity;
import com.gh.gamecenter.KaiFuActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameTestViewHolder;
import com.gh.gamecenter.adapter.viewholder.ReuseViewHolder;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.KaiFuServerEntity;
import com.gh.gamecenter.manager.GameManager;
import com.gh.gamecenter.retrofit.JSONObjectResponse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.adapter.BaseRecyclerAdapter;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import retrofit2.HttpException;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by khy on 2017/3/16.
*/
public class KaiFuAdapter extends BaseRecyclerAdapter<ViewHolder> {
private OnRequestCallBackListener mOnRequestCallBackListener;
private OnScrollToKaiFuIndexListener mOnScrollToKaiFuIndexListener;
private List<GameEntity> mSubjectList;
private ArrayMap<String, ArrayList<Integer>> mLocationMap;
private String mKaifuType;
private int mKaifuIndex = 0; // 开服零界点
private int mInitOffset;
private int mLoadCountTop; // 记录加载数量 上
private int mLoadCountBottom;// 记录加载数量 下
private long mTopLastTime;
private long mBottomLastTime;
private boolean mIsRemoveBottom;
private boolean mIsRemoveTop;
private boolean mIsNetworkError;
private boolean mIsLoadedBottom;
private boolean mIsLoadedTop;
public KaiFuAdapter(KaiFuActivity context, OnRequestCallBackListener callBackListener,
OnScrollToKaiFuIndexListener scrollToKaiFuIndexListener, String kaifuType) {
super(context);
mOnRequestCallBackListener = callBackListener;
mKaifuType = kaifuType;
mOnScrollToKaiFuIndexListener = scrollToKaiFuIndexListener;
mLocationMap = new ArrayMap<>();
mSubjectList = new ArrayList<>();
mIsLoadedTop = false;
mIsLoadedBottom = false;
mIsNetworkError = false;
mKaifuIndex = 0;
mLoadCountBottom = 0;
mLoadCountTop = 0;
if ("全部".equals(kaifuType)) {
this.mKaifuType = "all";
}
initKaiFuOffset();
}
public void initKaiFuOffset() {
RetrofitManager.getApi()
.getKaiFuOffset(mKaifuType)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new JSONObjectResponse() {
@Override
public void onResponse(JSONObject response) {
super.onResponse(response);
JSONObject jsonObject = response;
int offset = 0;
try {
offset = jsonObject.getInt("offset");
} catch (JSONException e) {
e.printStackTrace();
}
mInitOffset = offset;
mOnRequestCallBackListener.loadDone(offset);
initListBottom(offset);
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
mOnRequestCallBackListener.loadError();
}
});
}
public void initListTop(final int offset, int limit) {
mIsLoadedTop = false;
RetrofitManager.getApi().getKaiFuData(mKaifuType, offset, limit)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<GameEntity>>() {
@Override
public void onResponse(List<GameEntity> response) {
GameManager manager = new GameManager(mContext);
if (response.size() != 0) {
for (int i = 0; i < response.size(); i++) {
GameEntity entity = response.get(i);
// if (i < response.size() - 1) {
// GameEntity lastEntity = response.get(i + 1);
//
// KaiFuServerEntity curServerEntity = entity.getServerEntity();
// KaiFuServerEntity lastServerEntity = lastEntity.getServerEntity();
//
// if (i == 0 && curServerEntity != null && mTopLastTime > 0) {
// KaiFuUtils.setKaiFuTimeHint(curServerEntity.getTime() * 1000, mTopLastTime, entity, true);
// }
// if (curServerEntity == null || lastServerEntity == null) return;
//
// long curTime = curServerEntity.getTime() * 1000;
// long lastTime = lastServerEntity.getTime() * 1000;
// KaiFuUtils.setKaiFuTimeHint(curTime, lastTime, entity, true);
// } else { // response.size == 1
// KaiFuServerEntity curServerEntity = entity.getServerEntity();
// if (i == 0 && curServerEntity != null && mTopLastTime > 0) {
// KaiFuUtils.setKaiFuTimeHint(curServerEntity.getTime() * 1000, mTopLastTime, entity, true);
// }
// }
// 黄壮华 初始化游戏状态 修改2015/8/15
entity.setEntryMap(DownloadManager.getInstance(mContext).getEntryMap(entity.getName()));
manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName());
ApkActiveUtils.filterHideApk(entity);
}
mTopLastTime = response.get(0).getServerEntity().getTime() * 1000;
mSubjectList.addAll(0, response);
notifyItemRangeInserted(0, response.size());
if (response.size() < 20 || offset == 0) {
mIsRemoveTop = true;
notifyItemChanged(getItemCount() - 1);
}
mLoadCountTop = mLoadCountTop + response.size();
} else {
mIsRemoveTop = true;
notifyDataSetChanged();
}
initLocationMap();
mIsLoadedTop = true;
}
@Override
public void onFailure(HttpException e) {
if (offset == mInitOffset) {
if (mOnRequestCallBackListener != null) {
mOnRequestCallBackListener.loadError();
}
} else {
Toast.makeText(mContext, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show();
mIsNetworkError = true;
notifyDataSetChanged();
}
}
});
}
public void initListBottom(final int offset) {
mIsLoadedBottom = false;
RetrofitManager.getApi().getKaiFuData(mKaifuType, offset, 20)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<GameEntity>>() {
@Override
public void onResponse(List<GameEntity> response) {
GameManager manager = new GameManager(mContext);
if (response.size() != 0) {
if (offset == mInitOffset) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.MILLISECOND, 0);
long curTime = calendar.getTimeInMillis() / 1000;
for (int i = 0; i < response.size(); i++) {
long time = response.get(i).getServerEntity().getTime();
long l = time - curTime;
if (l > 0) {
mKaifuIndex = i;
break;
}
if (mKaifuIndex == 0 && i == response.size() - 1) {
mKaifuIndex = i + 1;
}
}
}
for (int i = 0; i < response.size(); i++) {
GameEntity entity = response.get(i);
if (i < response.size() - 1) {
GameEntity lastEntity = response.get(i + 1);
KaiFuServerEntity curServerEntity = entity.getServerEntity();
KaiFuServerEntity lastServerEntity = lastEntity.getServerEntity();
if (i == 0 && curServerEntity != null && mBottomLastTime > 0) {
KaiFuUtils.setKaiFuTimeHint(curServerEntity.getTime() * 1000, mBottomLastTime, entity, true);
entity.setShowTop(true);
}
if (curServerEntity == null || lastServerEntity == null) return;
long curTime = curServerEntity.getTime() * 1000;
long lastTime = lastServerEntity.getTime() * 1000;
if (offset == mInitOffset) {
// if (mKaifuIndex >= i + 1) {
//// KaiFuUtils.setKaiFuTimeHint(curTime, lastTime, entity, true);
// } else if (mKaifuIndex <= i - 1) {
KaiFuUtils.setKaiFuTimeHint(curTime, lastTime, lastEntity, false);
lastEntity.setShowTop(true);
// } else {
//// KaiFuUtils.setKaiFuTimeHint(curTime, lastTime, lastEntity, false);
//// KaiFuUtils.setKaiFuTimeHint(curTime, lastTime, entity, true);
//// entity.setShowTop(true);
// }
} else {
KaiFuUtils.setKaiFuTimeHint(curTime, lastTime, lastEntity, false);
lastEntity.setShowTop(true);
}
} else {
KaiFuServerEntity curServerEntity = entity.getServerEntity();
if (i == 0 && curServerEntity != null && mBottomLastTime > 0) {
KaiFuUtils.setKaiFuTimeHint(curServerEntity.getTime() * 1000, mBottomLastTime, entity, true);
entity.setShowTop(true);
}
}
// 黄壮华 初始化游戏状态 修改2015/8/15
entity.setEntryMap(DownloadManager.getInstance(mContext).getEntryMap(entity.getName()));
manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName());
ApkActiveUtils.filterHideApk(entity);
}
mBottomLastTime = response.get(response.size() - 1).getServerEntity().getTime() * 1000;
mTopLastTime = response.get(0).getServerEntity().getTime() * 1000;
mSubjectList.addAll(response);
notifyItemRangeInserted(getItemCount() - 1 - response.size(), response.size());
if (offset == mInitOffset) {
mIsLoadedTop = true; //首次加载 手动设置下拉加载完成
mLoadCountTop = response.size();//首次加载 下拉加载减去初始加载值 获取正确偏移量
mSubjectList.add(mKaifuIndex, new GameEntity()); // 添加一个空的实体当做 零界点ITEM
int locationTop = mKaifuIndex - 1;
if (locationTop > 0) {
GameEntity gameEntity = mSubjectList.get(locationTop);
gameEntity.setShowTop(false);
if (gameEntity.getKaifuTimeHint() == null) {
gameEntity.setKaifuTimeHint(gameEntity.getServerEntity().getTime() * 1000);
}
}
int locationBottom = mKaifuIndex + 1;
if (locationBottom < mSubjectList.size()) {
GameEntity gameEntity = mSubjectList.get(locationBottom);
if (gameEntity.getKaifuTimeHint() == null) {
gameEntity.setKaifuTimeHint(gameEntity.getServerEntity().getTime() * 1000);
gameEntity.setShowTop(true);
}
}
}
if (response.size() < 20) {
mIsRemoveBottom = true;
notifyItemChanged(getItemCount() - 1);
}
mLoadCountBottom = mLoadCountBottom + response.size();
} else {
mIsRemoveBottom = true;
notifyDataSetChanged();
}
initLocationMap();
if (mOnRequestCallBackListener != null) {
if (mSubjectList.size() == 0) {
mOnRequestCallBackListener.loadEmpty();
} else {
mOnRequestCallBackListener.loadDone();
}
}
mIsLoadedBottom = true;
if (offset == mInitOffset) { //定位到开服零界点
mOnScrollToKaiFuIndexListener.onScroll(mKaifuIndex - 1);
}
}
@Override
public void onFailure(HttpException e) {
if (offset == mInitOffset) {
if (mOnRequestCallBackListener != null) {
mOnRequestCallBackListener.loadError();
}
} else {
Toast.makeText(mContext, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show();
mIsNetworkError = true;
notifyDataSetChanged();
}
}
});
}
private void initLocationMap() {
ArrayList<Integer> list;
GameEntity gameEntity;
for (int i = 0, size = mSubjectList.size(); i < size; i++) {
int index = 0;
if (mInitOffset != 0) {
index++;
}
gameEntity = mSubjectList.get(i);
if (gameEntity.getApk() != null && gameEntity.getApk().size() != 0) {
for (ApkEntity apkEntity : gameEntity.getApk()) {
list = mLocationMap.get(apkEntity.getPackageName());
if (list == null) {
list = new ArrayList<>();
mLocationMap.put(apkEntity.getPackageName(), list);
}
list.add(i + index);
}
}
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view;
switch (viewType) {
case ItemViewType.LOADING:
view = mLayoutInflater.inflate(R.layout.refresh_footerview, viewGroup, false);
return new FooterViewHolder(view);
case ItemViewType.GAME_TEST:
view = mLayoutInflater.inflate(R.layout.game_test_item, viewGroup, false);
return new GameTestViewHolder(view);
case 100:
view = new View(mContext);
view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(mContext, 4)));
return new ReuseViewHolder(view);
default:
return null;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
int index = 0;
if (mInitOffset != 0) {
index++;
}
if (viewHolder instanceof GameTestViewHolder) {
initGameTestViewHolder((GameTestViewHolder) viewHolder, position - index);
} else if (viewHolder instanceof FooterViewHolder) {
initFooterViewHolder((FooterViewHolder) viewHolder, position);
}
}
@Override
public int getItemViewType(int position) {
int index = 0;
if (mInitOffset != 0) {
index++;
}
if (position == getItemCount() - 1 || (position == 0 && mInitOffset != 0)) {
return ItemViewType.LOADING;
}
if (TextUtils.isEmpty(mSubjectList.get(position - index).getId())) {
return 100;
} else {
return ItemViewType.GAME_TEST;
}
}
@Override
public int getItemCount() {
if (mSubjectList.size() < 1) {
return 0;
}
if (mInitOffset != 0) {
return mSubjectList.size() + 2;
}
return mSubjectList.size() + 1;
}
private void initGameTestViewHolder(final GameTestViewHolder holder, int position) {
holder.gameOrder.setVisibility(View.GONE);
final GameEntity gameEntity = mSubjectList.get(position);
KaiFuUtils.setKaiFuTimeHint(holder.kaifuTop, holder.kaifuBottom, mSubjectList, position);
if (gameEntity.getKaifuTimeHint() != null) {
if (gameEntity.isShowTop()) {
holder.kaifuTop.setVisibility(View.VISIBLE);
holder.kaifuBottom.setVisibility(View.GONE);
KaiFuUtils.initKaiFuTimeHintView(holder.kaifuTop, gameEntity.getKaifuTimeHint());
} else {
holder.kaifuBottom.setVisibility(View.VISIBLE);
holder.kaifuTop.setVisibility(View.GONE);
KaiFuUtils.initKaiFuTimeHintView(holder.kaifuBottom, gameEntity.getKaifuTimeHint());
}
} else {
holder.kaifuBottom.setVisibility(View.GONE);
holder.kaifuTop.setVisibility(View.GONE);
}
ImageUtils.Companion.display(holder.gameThumb, gameEntity.getIcon());
holder.gameName.setText(gameEntity.getName());
if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()) {
holder.gameDes.setText(gameEntity.getBrief());
} else {
holder.gameDes.setText(String.format("%s %s", gameEntity.getApk().get(0).getSize(), gameEntity.getBrief()));
}
KaiFuUtils.setKaiFuTime(holder.gameTestType, gameEntity.getServerEntity().getTime());
String type = gameEntity.getServerEntity().getType();
if ("不删档内测".equals(type) || "删档内测".equals(type)) {
KaiFuUtils.setKaiFuType(holder.gameTestTime, gameEntity.getServerEntity().getType());
} else if ("公测".equals(type)) {
String note = gameEntity.getServerEntity().getNote();
if (TextUtils.isEmpty(note)) {
KaiFuUtils.setKaiFuType(holder.gameTestTime, gameEntity.getServerEntity().getType());
} else {
KaiFuUtils.setKaiFuType(holder.gameTestTime, gameEntity.getServerEntity().getType() + "" + note);
}
} else {
KaiFuUtils.setKaiFuType(holder.gameTestTime, gameEntity.getServerEntity().getNote());
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Map<String, Object> kv = new HashMap<>();
kv.put("名字", gameEntity.getName());
kv.put("位置", String.valueOf(holder.getPosition() + 1));
DataUtils.onEvent(mContext, "点击", "开服表", kv);
DataCollectionUtils.uploadClick(mContext, "列表", "开服表", gameEntity.getName());
GameDetailActivity.startGameDetailActivity(mContext, gameEntity, StringUtils.buildString("主页-游戏", "+("
, "开服表", "[", String.valueOf(holder.getPosition()), "])"));
}
});
DownloadItemUtils.setOnClickListener(mContext,
holder.gameDownloadBtn, gameEntity, position,
KaiFuAdapter.this, StringUtils.buildString("主页游戏", "+(", "开服表", "[", String.valueOf(holder.getPosition()), "])")
, "开服表 :" + gameEntity.getName());
DownloadItemUtils.updateItem(mContext, gameEntity, holder, true);
}
private void initFooterViewHolder(FooterViewHolder viewHolder, final int position) {
viewHolder.initItemPadding();
if (mIsNetworkError) {
viewHolder.loading.setVisibility(View.GONE);
viewHolder.hint.setText("加载失败,点击重试");
viewHolder.itemView.setClickable(true);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mIsNetworkError = false;
notifyDataSetChanged();
if (position == getItemCount() - 1) {
initListBottom(mKaifuIndex + mLoadCountBottom);
} else {
int offset = mKaifuIndex - mLoadCountTop;
int limit = 20;
if (offset < 0) {
limit = limit + offset;
offset = 0;
}
initListTop(offset, limit);
}
}
});
} else if ((mIsRemoveBottom && position == getItemCount() - 1)
|| (mIsRemoveTop && position == 0)) {
viewHolder.loading.setVisibility(View.GONE);
viewHolder.hint.setText("加载完毕");
viewHolder.itemView.setClickable(false);
viewHolder.lineLeft.setVisibility(View.VISIBLE);
viewHolder.lineRight.setVisibility(View.VISIBLE);
} else {
viewHolder.loading.setVisibility(View.VISIBLE);
viewHolder.hint.setText(R.string.loading);
viewHolder.itemView.setClickable(false);
}
}
public List<GameEntity> getSubjectList() {
return mSubjectList;
}
public ArrayMap<String, ArrayList<Integer>> getLocationMap() {
return mLocationMap;
}
public boolean isLoadedBottom() {
return mIsLoadedBottom;
}
public boolean isLoadedTop() {
return mIsLoadedTop;
}
public int loadCountTop() {
return mLoadCountTop;
}
public int loadCountBottom() {
return mLoadCountBottom;
}
public int getLoadCountTop() {
return mLoadCountTop;
}
public interface OnScrollToKaiFuIndexListener {
void onScroll(int scrollPosition);
}
}

View File

@ -0,0 +1,32 @@
package com.gh.gamecenter.eventbus;
/**
* Created by khy on 20/08/17.
*/
public class EBKaiFuReset {
private String control;
private String gameId;
public EBKaiFuReset(String control, String gameId) {
this.control = control;
this.gameId = gameId;
}
public String getControl() {
return control;
}
public void setControl(String control) {
this.control = control;
}
public String getGameId() {
return gameId;
}
public void setGameId(String gameId) {
this.gameId = gameId;
}
}

View File

@ -239,11 +239,6 @@ public class GameFragment extends BaseFragment implements SwipeRefreshLayout.OnR
final ApkEntity normalApkEntity = apkEntities.get(0);
if (normalApkEntity.getPackageName().equals(busFour.getPackageName())) {
// if ("卸载".equals(busFour.getType())
// && DownloadManager.getInstance(getContext()).getDownloadEntityByUrl(
// normalApkEntity.getUrl()) != null) {
// adapter.notifyItemChanged(1); // TODO 有任务正在下载中,就算删除依然保留插件化??但是刷新好像也没什么用 @苏哥
// } else {
// 安装完成 插件化区域消失
list.remove(i);
if (list.isEmpty()) {

View File

@ -0,0 +1,115 @@
package com.gh.gamecenter.kaifu;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.CheckedTextView;
import android.widget.LinearLayout;
import com.gh.base.adapter.FragmentAdapter;
import com.gh.base.fragment.BaseFragment;
import com.gh.gamecenter.R;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
/**
* Created by khy on 20/08/17.
*/
public class KaiFuFragment extends BaseFragment {
@BindView(R.id.kaifu_tabbar_today)
CheckedTextView mKaifuTabbarToday;
@BindView(R.id.kaifu_tabbar_tomorrow)
CheckedTextView mKaifuTabbarTomorrow;
@BindView(R.id.kaifu_tabbar_future)
CheckedTextView mKaifuTabbarFuture;
@BindView(R.id.kaifu_tabbar)
LinearLayout mKaifuTabbar;
@BindView(R.id.kaifu_content_vp)
ViewPager mKaifuContentVp;
@Override
protected int getLayoutId() {
return R.layout.fragment_kaifu;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
List<Fragment> fragments = new ArrayList<>();
for (int i = 0; i < 3; i++) {
KaiFuVpFragment kaiFuVpFragment = new KaiFuVpFragment();
if (getArguments() != null) {
kaiFuVpFragment.setArguments(getArguments());
}
fragments.add(kaiFuVpFragment);
}
FragmentAdapter fragmentAdapter = new FragmentAdapter(getChildFragmentManager(), fragments);
setTabbarPosition(0);
mKaifuContentVp.setAdapter(fragmentAdapter);
mKaifuContentVp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
setTabbarPosition(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
@OnClick({R.id.kaifu_tabbar_today, R.id.kaifu_tabbar_tomorrow, R.id.kaifu_tabbar_future})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.kaifu_tabbar_today:
setTabbarPosition(0);
mKaifuContentVp.setCurrentItem(0);
break;
case R.id.kaifu_tabbar_tomorrow:
setTabbarPosition(1);
mKaifuContentVp.setCurrentItem(1);
break;
case R.id.kaifu_tabbar_future:
setTabbarPosition(2);
mKaifuContentVp.setCurrentItem(2);
break;
}
}
private void setTabbarPosition(int index) {
switch (index) {
case 0:
mKaifuTabbarToday.setChecked(true);
mKaifuTabbarFuture.setChecked(false);
mKaifuTabbarTomorrow.setChecked(false);
break;
case 1:
mKaifuTabbarToday.setChecked(false);
mKaifuTabbarFuture.setChecked(false);
mKaifuTabbarTomorrow.setChecked(true);
break;
case 2:
mKaifuTabbarToday.setChecked(false);
mKaifuTabbarFuture.setChecked(true);
mKaifuTabbarTomorrow.setChecked(false);
break;
}
}
}

View File

@ -0,0 +1,23 @@
package com.gh.gamecenter.kaifu;
import android.view.View;
import android.widget.TextView;
import com.gh.base.BaseRecyclerViewHolder;
import com.gh.gamecenter.R;
import butterknife.BindView;
/**
* Created by khy on 18/08/17.
*/
public class KaiFuTimeViewHolder extends BaseRecyclerViewHolder {
@BindView(R.id.kaifu_item_time_tv)
TextView time;
public KaiFuTimeViewHolder(View itemView) {
super(itemView);
}
}

View File

@ -0,0 +1,384 @@
package com.gh.gamecenter.kaifu;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.content.ContextCompat;
import android.support.v4.util.ArrayMap;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.gh.base.OnRequestCallBackListener;
import com.gh.common.util.ApkActiveUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.DownloadItemUtils;
import com.gh.common.util.KaiFuUtils;
import com.gh.common.util.StringUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.GameDetailActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameTestViewHolder;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.KaiFuServerEntity;
import com.gh.gamecenter.eventbus.EBKaiFuReset;
import com.gh.gamecenter.manager.GameManager;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.adapter.BaseRecyclerAdapter;
import org.greenrobot.eventbus.EventBus;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import retrofit2.HttpException;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import static com.gh.gamecenter.KaiFuActivity.ALL_GAME_KAIFU;
import static com.gh.gamecenter.KaiFuActivity.SINGLE_GAME_KAIFU;
/**
* Created by khy on 18/08/17.
*/
public class KaiFuVpAdapter extends BaseRecyclerAdapter {
private OnRequestCallBackListener mOnCallBackListener;
private List<GameEntity> mEntityList;
private ArrayMap<String, ArrayList<Integer>> mLocationMap;
private int mDataCount;
private String mGameId;
private boolean mIsRemove;
private boolean mIsNetworkError;
private boolean mIsLoaded;
public KaiFuVpAdapter(Context context, OnRequestCallBackListener onCallBackListener, String gameId) {
super(context);
mGameId = gameId;
mOnCallBackListener = onCallBackListener;
mLocationMap = new ArrayMap<>();
mEntityList = new ArrayList<>();
addList(0);
}
public void addList(int offset) {
mIsLoaded = false;
RetrofitManager.getApi()
.getKaiFuData(mGameId, offset, 20)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<GameEntity>>(){
@Override
public void onResponse(List<GameEntity> response) {
super.onResponse(response);
mDataCount += response.size();
if (mEntityList.size() == 0) { // TODO 获取开服表当前整点时间位置
}
if (response.size() < 20) mIsRemove = true;
GameManager manager = new GameManager(mContext);
for (int i = 0; i < response.size(); i++) {
// 初始化游戏状态
response.get(i).setEntryMap(DownloadManager.getInstance(mContext).getEntryMap(response.get(i).getName()));
manager.addOrUpdate(response.get(i).getApk(), response.get(i).getId(), response.get(i).getName());
ApkActiveUtils.filterHideApk(response.get(i)); // 过滤隐藏apk
// 设置时间断点
if (i == 0) {
if (mEntityList.size() == 0) {
GameEntity kaiFuTimeEntity = new GameEntity();
kaiFuTimeEntity.setKaifuTimeHint(response.get(i).getServerEntity().getTime());
response.add(i, kaiFuTimeEntity);
i++;
continue;
} else {
GameEntity gameEntity = mEntityList.get(mEntityList.size() - 1);
long time = gameEntity.getServerEntity().getTime();
long nextTime = response.get(i).getServerEntity().getTime();
if (time != nextTime) {
GameEntity kaiFuTimeEntity = new GameEntity();
kaiFuTimeEntity.setKaifuTimeHint(nextTime);
response.add(i, kaiFuTimeEntity);
i++;
continue;
}
}
}
if (i < response.size() - 1) {
KaiFuServerEntity serverEntity = response.get(i).getServerEntity();
KaiFuServerEntity nextServerEntity = response.get(i + 1).getServerEntity();
if (serverEntity == null || nextServerEntity == null) continue;
long time = serverEntity.getTime();
long nextTime = nextServerEntity.getTime();
if (time != nextTime) {
GameEntity kaiFuTimeEntity = new GameEntity();
kaiFuTimeEntity.setKaifuTimeHint(nextTime);
response.add(i + 1,kaiFuTimeEntity);
i++;
}
}
}
mEntityList.addAll(response);
notifyItemRangeInserted(mEntityList.size() - response.size(), response.size());
initLocationMap();
if (mEntityList.size() == 0) {
mOnCallBackListener.loadEmpty();
} else {
mOnCallBackListener.loadDone();
}
mIsLoaded = true;
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
mIsLoaded = true;
if (mEntityList.size() == 0) {
mOnCallBackListener.loadError();
} else {
mIsNetworkError = true;
}
}
});
}
private void initLocationMap() {
ArrayList<Integer> list;
GameEntity gameEntity;
for (int i = 0, size = mEntityList.size(); i < size; i++) {
gameEntity = mEntityList.get(i);
if (gameEntity.getApk() != null && gameEntity.getApk().size() != 0) {
for (ApkEntity apkEntity : gameEntity.getApk()) {
list = mLocationMap.get(apkEntity.getPackageName());
if (list == null) {
list = new ArrayList<>();
mLocationMap.put(apkEntity.getPackageName(), list);
}
list.add(i);
}
}
}
}
@Override
public int getItemViewType(int position) {
if (mEntityList.size() == position) {
return 0;
}
GameEntity gameEntity = mEntityList.get(position);
if (gameEntity.getKaifuTimeHint() != null && gameEntity.getKaifuTimeHint() != 0) {
return 1;
}
return 2;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 0) {
return new FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false));
} else if (viewType == 1) {
return new KaiFuTimeViewHolder(mLayoutInflater.inflate(R.layout.kaifu_item_time, parent, false));
} else {
return new GameTestViewHolder(mLayoutInflater.inflate(R.layout.game_test_item, parent, false));
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof GameTestViewHolder) {
GameEntity gameEntity = mEntityList.get(position);
GameTestViewHolder viewHolder = (GameTestViewHolder) holder;
initGameTestViewHolder(gameEntity, viewHolder);
} else if (holder instanceof KaiFuTimeViewHolder){
GameEntity gameEntity = mEntityList.get(position);
SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd (EEEE) HH: mm", Locale.CHINA);
((KaiFuTimeViewHolder) holder).time.setText(dateFm.format(gameEntity.getKaifuTimeHint() * 1000));
} else if (holder instanceof FooterViewHolder) {
FooterViewHolder viewHolder = (FooterViewHolder) holder;
initFooterViewHolder(viewHolder);
}
}
@Override
public int getItemCount() {
if (mEntityList.size() == 0) {
return 0;
}
return mEntityList.size() + 1;
}
private void initGameTestViewHolder(final GameEntity gameEntity, GameTestViewHolder viewHolder) {
viewHolder.gameName.setText(gameEntity.getName());
viewHolder.gameThumb.setImageURI(gameEntity.getIcon());
String type = gameEntity.getServerEntity().getType();
if ("不删档内测".equals(type) || "删档内测".equals(type)) {
KaiFuUtils.setKaiFuType(viewHolder.gameTestTime, gameEntity.getServerEntity().getType());
} else if ("公测".equals(type)) {
String note = gameEntity.getServerEntity().getNote();
if (TextUtils.isEmpty(note)) {
KaiFuUtils.setKaiFuType(viewHolder.gameTestTime, gameEntity.getServerEntity().getType());
} else {
KaiFuUtils.setKaiFuType(viewHolder.gameTestTime, gameEntity.getServerEntity().getType() + "" + note);
}
} else {
KaiFuUtils.setKaiFuType(viewHolder.gameTestTime, gameEntity.getServerEntity().getNote());
}
if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()) {
viewHolder.gameDes.setText(gameEntity.getBrief());
} else {
viewHolder.gameDes.setText(String.format("%s %s", gameEntity.getApk().get(0).getSize(), gameEntity.getBrief()));
}
KaiFuUtils.setKaiFuTime(viewHolder.gameTestType, gameEntity.getServerEntity().getTime());
DownloadItemUtils.setOnClickListener(mContext,
viewHolder.gameDownloadBtn, gameEntity, viewHolder.getAdapterPosition(), KaiFuVpAdapter.this,
StringUtils.buildString("首页-推荐入口", "+(", "开服表", "[", String.valueOf(viewHolder.getAdapterPosition() + 1), "])"),
StringUtils.buildString("开服表", ":", gameEntity.getName()));
DownloadItemUtils.updateItem(mContext, gameEntity, viewHolder, true);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showSkiptDialog(gameEntity);
}
});
}
private void showSkiptDialog(final GameEntity gameEntity) {
final Dialog dialog = new Dialog(mContext);
LinearLayout container = new LinearLayout(mContext);
container.setOrientation(LinearLayout.VERTICAL);
container.setBackgroundColor(Color.WHITE);
container.setPadding(0, DisplayUtils.dip2px(mContext, 12), 0, DisplayUtils.dip2px(mContext, 12));
final List<String> dialogType = new ArrayList<>();
if (TextUtils.isEmpty(mGameId)) {
dialogType.add("只看这个游戏");
} else {
dialogType.add("返回所有游戏");
}
dialogType.add("进入游戏详情");
for (String s : dialogType) {
final TextView skipTv = new TextView(mContext);
skipTv.setText(s);
skipTv.setTextSize(17);
skipTv.setTextColor(ContextCompat.getColor(mContext, R.color.title));
skipTv.setBackgroundResource(R.drawable.textview_white_style);
int widthPixels = mContext.getResources().getDisplayMetrics().widthPixels;
skipTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10,
LinearLayout.LayoutParams.WRAP_CONTENT));
skipTv.setPadding(DisplayUtils.dip2px(mContext, 20), DisplayUtils.dip2px(mContext, 12),
0, DisplayUtils.dip2px(mContext, 12));
container.addView(skipTv);
skipTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.cancel();
switch (skipTv.getText().toString()) {
case "只看这个游戏":
EventBus.getDefault().post(new EBKaiFuReset(SINGLE_GAME_KAIFU, gameEntity.getId()));
break;
case "进入游戏详情":
GameDetailActivity.startGameDetailActivity(mContext, gameEntity, "");
break;
case "返回所有游戏":
EventBus.getDefault().post(new EBKaiFuReset(ALL_GAME_KAIFU, gameEntity.getId()));
break;
}
}
});
}
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(container);
dialog.show();
}
private void initFooterViewHolder(FooterViewHolder viewHolder) {
if (mIsNetworkError) {
viewHolder.loading.setVisibility(View.GONE);
viewHolder.hint.setText("加载失败,点击重试");
viewHolder.itemView.setClickable(true);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mIsNetworkError = false;
notifyItemChanged(getItemCount() - 1);
addList(mDataCount);
}
});
} else if (mIsRemove) {
viewHolder.loading.setVisibility(View.GONE);
viewHolder.hint.setText("加载完毕");
viewHolder.itemView.setClickable(false);
viewHolder.lineLeft.setVisibility(View.VISIBLE);
viewHolder.lineRight.setVisibility(View.VISIBLE);
} else {
viewHolder.loading.setVisibility(View.VISIBLE);
viewHolder.hint.setText(R.string.loading);
viewHolder.itemView.setClickable(false);
}
}
public boolean isLoaded() {
return mIsLoaded;
}
public boolean isRemove() {
return mIsRemove;
}
public int getDataListCount() {
return mDataCount;
}
public List<GameEntity> getDataList() {
return mEntityList;
}
public ArrayMap<String, ArrayList<Integer>> getLocationMap() {
return mLocationMap;
}
}

View File

@ -0,0 +1,224 @@
package com.gh.gamecenter.kaifu;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.gc.materialdesign.views.ProgressBarCircularIndeterminate;
import com.gh.base.fragment.BaseFragment;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.DownloadItemUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.KaiFuServerEntity;
import com.gh.gamecenter.eventbus.EBDownloadStatus;
import com.lightgame.download.DataWatcher;
import com.lightgame.download.DownloadEntity;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import butterknife.BindView;
import butterknife.OnClick;
/**
* Created by khy on 18/08/17.
*/
public class KaiFuVpFragment extends BaseFragment {
@BindView(R.id.kaifu_rv)
RecyclerView mRecyclerView;
@BindView(R.id.kaifu_item_time_tv)
TextView mKaifuItemTimeTv;
@BindView(R.id.kaifu_item_time)
LinearLayout mKaiFuTimeLl;
@BindView(R.id.kaifu_pb_loading)
ProgressBarCircularIndeterminate mLoading;
@BindView(R.id.reuse_no_connection)
LinearLayout mNoConn;
@BindView(R.id.reuse_none_data)
LinearLayout mNoneData;
private KaiFuVpAdapter mAdapter;
private LinearLayoutManager mLayoutManager;
private RelativeLayout.LayoutParams mLlparams;
private String mGameId;
private DataWatcher dataWatcher = new DataWatcher() {
@Override
public void onDataChanged(DownloadEntity downloadEntity) {
ArrayList<Integer> locationList = mAdapter.getLocationMap().get(downloadEntity.getPackageName());
if (locationList != null) {
GameEntity gameEntity;
for (int location : locationList) {
gameEntity = mAdapter.getDataList().get(location);
if (gameEntity != null) {
DownloadItemUtils.processDate(getContext(), gameEntity, downloadEntity,
mAdapter, location);
}
}
}
}
};
@Override
protected int getLayoutId() {
return R.layout.fragment_kaifu_vp;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle arguments = getArguments();
if (arguments != null) {
mGameId = arguments.getString("gameId", "");
} else {
mGameId = "";
}
mLlparams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
DisplayUtils.dip2px(getContext(), 40));
((DefaultItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
mLayoutManager = new LinearLayoutManager(getContext());
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new KaiFuVpAdapter(getContext(), this, mGameId);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (mLayoutManager.findLastVisibleItemPosition() == mAdapter.getItemCount() - 1
&& newState == RecyclerView.SCROLL_STATE_IDLE && !mAdapter.isRemove() && mAdapter.isLoaded()) {
mAdapter.addList(mAdapter.getDataListCount());
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int position = mLayoutManager.findFirstVisibleItemPosition();
List<GameEntity> dataList = mAdapter.getDataList();
GameEntity gameEntity = dataList.get(position + 1);
Long kaifuTimeHint = gameEntity.getKaifuTimeHint();
// 悬挂的文案
GameEntity timeGameEntity = dataList.get(position);
Long timeHint = timeGameEntity.getKaifuTimeHint();
SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd (EEEE) HH: mm", Locale.CHINA);
if (timeHint == null || timeHint == 0) {
KaiFuServerEntity serverEntity = timeGameEntity.getServerEntity();
if (serverEntity != null) {
mKaifuItemTimeTv.setText(dateFm.format(serverEntity.getTime() * 1000));
}
} else {
mKaifuItemTimeTv.setText(dateFm.format(timeHint * 1000));
}
// 悬挂界面移动
if (kaifuTimeHint != null && kaifuTimeHint != 0) {
int buttom = mLayoutManager.findViewByPosition(position).getBottom();
if (buttom <= mKaiFuTimeLl.getHeight()) {
mLlparams.topMargin = buttom - mKaiFuTimeLl.getHeight();
mKaiFuTimeLl.setLayoutParams(mLlparams);
} else {
mLlparams.topMargin = 0;
mKaiFuTimeLl.setLayoutParams(mLlparams);
}
} else {
mLlparams.topMargin = 0;
mKaiFuTimeLl.setLayoutParams(mLlparams);
}
}
});
}
@Override
public void onResume() {
super.onResume();
mAdapter.notifyDataSetChanged();
DownloadManager.getInstance(getContext()).addObserver(dataWatcher);
}
@Override
public void onPause() {
super.onPause();
DownloadManager.getInstance(getContext()).removeObserver(dataWatcher);
}
@OnClick(R.id.reuse_no_connection)
public void onClick() {
mLoading.setVisibility(View.VISIBLE);
mNoConn.setVisibility(View.GONE);
mNoneData.setVisibility(View.GONE);
mAdapter = new KaiFuVpAdapter(getContext(), this, mGameId);
mRecyclerView.setAdapter(mAdapter);
}
// 下载被删除事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBDownloadStatus status) {
if ("delete".equals(status.getStatus())) {
DownloadManager.getInstance(getContext()).removePlatform(status.getName(), status.getPlatform());
ArrayList<Integer> locationList = mAdapter.getLocationMap().get(status.getPackageName());
if (locationList != null) {
GameEntity gameEntity;
for (int location : locationList) {
gameEntity = mAdapter.getDataList().get(location);
if (gameEntity != null && gameEntity.getEntryMap() != null) {
gameEntity.getEntryMap().remove(status.getPlatform());
}
mAdapter.notifyItemChanged(location);
}
}
}
}
@Override
public void loadDone() {
super.loadDone();
mKaiFuTimeLl.setVisibility(View.VISIBLE);
mNoConn.setVisibility(View.GONE);
mNoneData.setVisibility(View.GONE);
mLoading.setVisibility(View.GONE);
}
@Override
public void loadError() {
super.loadError();
toast("加载失败,请检查网络状态");
mNoConn.setVisibility(View.VISIBLE);
mNoneData.setVisibility(View.GONE);
mLoading.setVisibility(View.GONE);
}
@Override
public void loadEmpty() {
super.loadEmpty();
mNoConn.setVisibility(View.GONE);
mNoneData.setVisibility(View.VISIBLE);
mLoading.setVisibility(View.GONE);
}
}

View File

@ -189,7 +189,7 @@ public class SubjectTileFragment extends BaseFragment implements SubjectTypeAdap
switch (view.getId()) {
case R.id.subject_tabbar_hot_tv:
mTabbarHotTv.setTextColor(Color.WHITE);
mTabbarHotTv.setBackgroundResource(R.drawable.gamedetail_tag_select_bg);
mTabbarHotTv.setBackgroundResource(R.drawable.tabbar_left_bg);
mTabbarNewTv.setTextColor(Color.BLACK);
mTabbarNewTv.setBackgroundDrawable(new ColorDrawable(0));
mListOrder = "";
@ -199,7 +199,7 @@ public class SubjectTileFragment extends BaseFragment implements SubjectTypeAdap
mTabbarHotTv.setTextColor(Color.BLACK);
mTabbarHotTv.setBackgroundDrawable(new ColorDrawable(0));
mTabbarNewTv.setTextColor(Color.WHITE);
mTabbarNewTv.setBackgroundResource(R.drawable.gamedetail_tag_unselect_bg);
mTabbarNewTv.setBackgroundResource(R.drawable.tabbar_right_bg);
mListOrder = "latest";
loadData();
break;