Files
assistant-android/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java
khy 7267535ccf Merge remote-tracking branch 'origin/2.5' into 2.5
# Conflicts:
#	app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.java
2017-04-14 16:15:19 +08:00

412 lines
13 KiB
Java

package com.gh.gamecenter.adapter;
import android.content.Context;
import android.support.v4.util.ArrayMap;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.gh.common.constant.ItemViewType;
import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DownloadItemUtils;
import com.gh.common.util.GameUtils;
import com.gh.common.util.GameViewUtils;
import com.gh.common.util.ImageUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.R;
import com.gh.gamecenter.SubjectActivity;
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameImageViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameNormalViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameTestViewHolder;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.listener.OnCallBackListener;
import com.gh.gamecenter.manager.GameManager;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import retrofit2.adapter.rxjava.HttpException;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
public class SubjectAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private OnCallBackListener listener;
private List<GameEntity> subjectList;
private ArrayMap<String, ArrayList<Integer>> locationMap;
private String id;
private String name;
private String entrance;
private String type;
private boolean isRemove;
private boolean isNetworkError;
private boolean order;
private boolean isLoaded;
public SubjectAdapter(SubjectActivity activity, String type) {
this.context = activity;
this.listener = activity;
this.type = type;
this.id = activity.getIntent().getStringExtra("id");
this.name = activity.getIntent().getStringExtra("name");
this.order = activity.getIntent().getBooleanExtra("order", false);
this.entrance = activity.getIntent().getStringExtra("entrance");
if (activity.getIntent().getBundleExtra("data") != null) {
this.id = activity.getIntent().getBundleExtra("data").getString("id");
this.name = activity.getIntent().getBundleExtra("data").getString("name");
this.order = activity.getIntent().getBundleExtra("data").getBoolean("order", false);
this.entrance = activity.getIntent().getBundleExtra("data").getString("entrance");
}
locationMap = new ArrayMap<>();
subjectList = new ArrayList<>();
isLoaded = false;
isNetworkError = false;
isRemove = false;
initList(1, type);
}
public void initList(final int page, String type) {
if ("全部".equals(type)) {
type = "";
}
isLoaded = false;
RetrofitManager.getApi().getColumn(id, page, type)
.map(new Func1<List<GameEntity>, List<GameEntity>>() {
@Override
public List<GameEntity> call(List<GameEntity> list) {
return removeDuplicateData(subjectList, list);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<List<GameEntity>>() {
@Override
public void onResponse(List<GameEntity> response) {
GameManager manager = new GameManager(context);
if (response.size() != 0) {
for (GameEntity entity : response) {
// 黄壮华 初始化游戏状态 修改2015/8/15
entity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(entity.getName()));
manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName());
}
if (page == 1) {
if (response.get(0).getTag().size() != 0) {
listener.loadDone(response.get(0).getTag());
}
if (TextUtils.isEmpty(response.get(0).getToutu())) {
response.remove(0);
}
}
subjectList.addAll(response);
notifyItemRangeInserted(subjectList.size() - response.size(), response.size());
if (response.size() < 20 && page != 1 || response.size() < 19) {
isRemove = true;
notifyItemChanged(getItemCount() - 1);
}
} else {
isRemove = true;
notifyDataSetChanged();
}
initLocationMap();
if (listener != null ) {
listener.loadDone();
}
isLoaded = true;
}
@Override
public void onFailure(HttpException e) {
isLoaded = true;
if (page == 1){
if (listener != null) {
listener.loadError();
}
}else {
Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show();
isNetworkError = true;
notifyDataSetChanged();
}
}
});
}
private void initLocationMap() {
ArrayList<Integer> list;
GameEntity gameEntity;
for (int i = 0, size = subjectList.size(); i < size; i++) {
gameEntity = subjectList.get(i);
if (gameEntity.getApk() != null && gameEntity.getApk().size() != 0) {
for (ApkEntity apkEntity : gameEntity.getApk()) {
list = locationMap.get(apkEntity.getPackageName());
if (list == null) {
list = new ArrayList<>();
locationMap.put(apkEntity.getPackageName(), list);
}
list.add(i);
}
}
}
}
private List<GameEntity> removeDuplicateData(List<GameEntity> sourceList, List<GameEntity> rawList) {
if (sourceList == null || sourceList.isEmpty()
|| rawList == null || rawList.isEmpty()) {
return rawList;
}
String id;
for (int i = 0; i < rawList.size(); i++) {
id = rawList.get(i).getId();
for (GameEntity gameEntity : sourceList) {
if (id.equals(gameEntity.getId())) {
rawList.remove(i);
i--;
break;
}
}
}
return rawList;
}
@Override
public int getItemCount() {
if (subjectList.size() < 1) {
return 0;
}
return subjectList.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position == subjectList.size()) {
return ItemViewType.LOADING;
}
if (position == 0 && !TextUtils.isEmpty(subjectList.get(position).getToutu())) {
return ItemViewType.GAME_IMAGE;
} else if (subjectList.get(position).getTest() != null) {
return ItemViewType.GAME_TEST;
} else {
return ItemViewType.GAME_NORMAL;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
if (viewType == ItemViewType.LOADING){
View view = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.refresh_footerview, viewGroup, false);
return new FooterViewHolder(view);
} else if (viewType == ItemViewType.GAME_TEST) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.game_test_item, viewGroup, false);
return new GameTestViewHolder(view);
} else if (viewType == ItemViewType.GAME_NORMAL) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.game_normal_item, viewGroup, false);
return new GameNormalViewHolder(view);
} else if (viewType == ItemViewType.GAME_IMAGE) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.game_image_item, viewGroup, false);
return new GameImageViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder instanceof GameNormalViewHolder) {
initGameNormalViewHolder((GameNormalViewHolder) viewHolder, position);
} else if (viewHolder instanceof GameTestViewHolder) {
initGameTestViewHolder((GameTestViewHolder) viewHolder, position);
} else if (viewHolder instanceof FooterViewHolder){
initFooterViewHolder((FooterViewHolder) viewHolder);
} else if (viewHolder instanceof GameImageViewHolder) {
GameImageViewHolder holder = ((GameImageViewHolder) viewHolder);
holder.line.setVisibility(View.GONE);
ImageUtils.display(holder.image, subjectList.get(position).getToutu());
}
}
private void initFooterViewHolder(FooterViewHolder viewHolder) {
if (isNetworkError) {
viewHolder.loading.setVisibility(View.GONE);
viewHolder.hint.setText("加载失败,点击重试");
viewHolder.itemView.setClickable(true);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isNetworkError = false;
notifyDataSetChanged();
initList((subjectList.size() / 20) + 1, type);
}
});
} else if (isRemove) {
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("加载中...");
viewHolder.itemView.setClickable(false);
}
}
private void initGameTestViewHolder(final GameTestViewHolder holder, int position) {
if (order) {
int index = 1;
if (subjectList.get(0).getToutu() != null) {
index = 0;
}
holder.gameOrder.setVisibility(View.VISIBLE);
holder.gameOrder.setText(String.valueOf(position + index));
} else {
holder.gameOrder.setVisibility(View.GONE);
}
final GameEntity gameEntity = subjectList.get(position);
// holder.gameThumb.setImageURI(gameEntity.getIcon());
ImageUtils.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()));
}
holder.gameTestType.setText(gameEntity.getTest().getType());
if (gameEntity.getTest().getStart() == 0) {
holder.gameTestTime.setVisibility(View.GONE);
} else {
holder.gameTestTime.setText(GameViewUtils.getGameTestDate(gameEntity.getTest().getStart()));
}
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(context, "点击", name, kv);
DataCollectionUtils.uploadClick(context, "列表", name, gameEntity.getName());
GameUtils.startGameDetailActivity(context, gameEntity, entrance + "+(" + name + "[" + (holder.getPosition() + 1) + "])");
}
});
if (gameEntity.getTest().getEnd() != 0) {
long endTime = Long.valueOf(gameEntity.getTest().getEnd() + "000");
long todayTime = new Date().getTime();
if (todayTime > endTime) {
// 测试时间已过
gameEntity.setApk(null);
}
}
DownloadItemUtils.setOnClickListener(context,
holder.gameDownloadBtn, gameEntity, position,
SubjectAdapter.this, entrance + "+(" + name + "[" + (holder.getPosition() + 1) + "])", name + ":" + gameEntity.getName());
DownloadItemUtils.updateItem(context, gameEntity, holder, true);
}
private void initGameNormalViewHolder(final GameNormalViewHolder holder, int position) {
if (order) {
int index = 1;
if (subjectList.get(0).getToutu() != null) {
index = 0;
}
holder.gameOrder.setVisibility(View.VISIBLE);
holder.gameOrder.setText(String.valueOf(position + index));
} else {
holder.gameOrder.setVisibility(View.GONE);
}
final GameEntity gameEntity = subjectList.get(position);
// holder.gameThumb.setImageURI(gameEntity.getIcon());
ImageUtils.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()));
}
GameViewUtils.setLabelList(context, holder.gameLabelList, gameEntity.getTag());
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(context, "点击", name, kv);
DataCollectionUtils.uploadClick(context, "列表", name, gameEntity.getName());
GameUtils.startGameDetailActivity(context, gameEntity, entrance + "+(" + name + "[" + (holder.getPosition() + 1) + "])");
}
});
DownloadItemUtils.setOnClickListener(context, holder.gameDownloadBtn,
gameEntity, position, this, entrance + "+(" + name + "[" + (holder.getPosition() + 1) + "])", name + ":" + gameEntity.getName());
DownloadItemUtils.updateItem(context, gameEntity, holder, true);
}
public List<GameEntity> getSubjectList() {
return subjectList;
}
public ArrayMap<String, ArrayList<Integer>> getLocationMap() {
return locationMap;
}
public boolean isLoaded(){
return isLoaded;
}
public boolean isRemove(){
return isRemove;
}
}