412 lines
13 KiB
Java
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;
|
|
}
|
|
|
|
|
|
}
|