432 lines
14 KiB
Java
432 lines
14 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.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.Toast;
|
|
|
|
import com.android.volley.NoConnectionError;
|
|
import com.android.volley.Response;
|
|
import com.android.volley.TimeoutError;
|
|
import com.android.volley.VolleyError;
|
|
import com.gh.base.AppController;
|
|
import com.gh.common.constant.Config;
|
|
import com.gh.common.constant.ItemViewType;
|
|
import com.gh.common.util.DataUtils;
|
|
import com.gh.common.util.DisplayUtils;
|
|
import com.gh.common.util.DownloadItemUtils;
|
|
import com.gh.common.util.GameUtils;
|
|
import com.gh.common.util.GameViewUtils;
|
|
import com.gh.common.view.CardLinearLayout;
|
|
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.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.DataCollectionManager;
|
|
import com.gh.gamecenter.manager.GameManager;
|
|
import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest;
|
|
import com.google.gson.Gson;
|
|
import com.google.gson.reflect.TypeToken;
|
|
|
|
import org.json.JSONArray;
|
|
|
|
import java.lang.reflect.Type;
|
|
import java.util.ArrayList;
|
|
import java.util.Date;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
*
|
|
* @author 温冠超
|
|
* @email 294299195@qq.com
|
|
* @date 2015-8-8
|
|
* @update 2015-8-11
|
|
* @des 首页插件fragment适配器
|
|
*/
|
|
public class SubjectAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
|
|
|
private Context context;
|
|
private OnCallBackListener listener;
|
|
|
|
private List<GameEntity> subjectList;
|
|
private boolean order;
|
|
private boolean isLoaded;
|
|
|
|
private ArrayMap<String, ArrayList<Integer>> locationMap;
|
|
|
|
private String id;
|
|
private String name;
|
|
private String entrance;
|
|
|
|
private boolean isRemove;
|
|
private boolean isNetworkError;
|
|
|
|
public SubjectAdapter(SubjectActivity activity) {
|
|
|
|
this.context = activity;
|
|
this.listener = activity;
|
|
|
|
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");
|
|
|
|
locationMap = new ArrayMap<>();
|
|
|
|
subjectList = new ArrayList<>();
|
|
isLoaded = false;
|
|
isNetworkError = false;
|
|
|
|
initList(1);
|
|
}
|
|
|
|
public void initList(final int page) {
|
|
isLoaded = false;
|
|
JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(
|
|
Config.HOST + "game/column/" + id + "?page=" + page,
|
|
new Response.Listener<JSONArray>() {
|
|
@Override
|
|
public void onResponse(JSONArray response) {
|
|
processingData(response, page);
|
|
}
|
|
}, new Response.ErrorListener() {
|
|
@Override
|
|
public void onErrorResponse(VolleyError error) {
|
|
// 无网络连接
|
|
if (error.getClass().equals(NoConnectionError.class)
|
|
|| error.getClass().equals(TimeoutError.class)) {
|
|
if (page == 1){
|
|
if (listener != null) {
|
|
listener.loadError();
|
|
}
|
|
}else {
|
|
Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show();
|
|
isNetworkError = true;
|
|
notifyDataSetChanged();
|
|
}
|
|
|
|
}
|
|
}
|
|
});
|
|
AppController.addToRequestQueue(request, SubjectActivity.TAG);
|
|
}
|
|
|
|
private void processingData(JSONArray response, int page) {
|
|
Type listType = new TypeToken<ArrayList<GameEntity>>() {}.getType();
|
|
Gson gson = new Gson();
|
|
GameManager manager = new GameManager(context);
|
|
List<GameEntity> gameList = gson.fromJson(response.toString(), listType);
|
|
|
|
int listSize = gameList.size();
|
|
|
|
// 去除重复数据
|
|
removeDuplicateData(gameList);
|
|
|
|
if (!gameList.isEmpty()) {
|
|
for (GameEntity entity : gameList) {
|
|
// 黄壮华 初始化游戏状态 修改2015/8/15
|
|
entity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(entity.getName()));
|
|
manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName());
|
|
}
|
|
subjectList.addAll(gameList);
|
|
notifyItemRangeInserted(subjectList.size() - gameList.size(), gameList.size());
|
|
}
|
|
|
|
initLocationMap();
|
|
|
|
if (listener != null) {
|
|
listener.loadDone();
|
|
}
|
|
|
|
if (listSize == 0 || (page == 1 && listSize < 20)) {
|
|
isRemove = true;
|
|
notifyDataSetChanged();
|
|
}
|
|
isLoaded = true;
|
|
}
|
|
|
|
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 void removeDuplicateData(List<GameEntity> gameList) {
|
|
if (subjectList == null || subjectList.isEmpty()) {
|
|
return;
|
|
}
|
|
String id;
|
|
for (int i = 0; i < gameList.size(); i++) {
|
|
id = gameList.get(i).getId();
|
|
for (GameEntity gameEntity : subjectList) {
|
|
if (id.equals(gameEntity.getId())) {
|
|
gameList.remove(i);
|
|
i--;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@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 (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);
|
|
}
|
|
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);
|
|
}
|
|
}
|
|
|
|
private void initFooterViewHolder(FooterViewHolder viewHolder) {
|
|
if (isNetworkError) {
|
|
viewHolder.footerview_progressbar.setVisibility(View.GONE);
|
|
viewHolder.footerview_tv_loading.setText("加载失败,点击重试");
|
|
viewHolder.itemView.setClickable(true);
|
|
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
isNetworkError = false;
|
|
notifyDataSetChanged();
|
|
initList(subjectList.size() / 21);
|
|
}
|
|
});
|
|
} else if (isRemove) {
|
|
viewHolder.footerview_progressbar.setVisibility(View.GONE);
|
|
viewHolder.footerview_tv_loading.setText("加载完毕");
|
|
viewHolder.itemView.setClickable(false);
|
|
} else {
|
|
viewHolder.footerview_progressbar.setVisibility(View.VISIBLE);
|
|
viewHolder.footerview_tv_loading.setText("加载中...");
|
|
viewHolder.itemView.setClickable(false);
|
|
}
|
|
}
|
|
|
|
private void initGameTestViewHolder(final GameTestViewHolder holder, int position) {
|
|
|
|
// 第一个
|
|
if (position == 0) {
|
|
((CardLinearLayout) holder.itemView).setmTop(DisplayUtils.dip2px(context, 8));
|
|
} else {
|
|
((CardLinearLayout) holder.itemView).setmTop(0);
|
|
}
|
|
|
|
// 最后一个
|
|
if (position == subjectList.size() - 1) {
|
|
((CardLinearLayout) holder.itemView).setBottom(true);
|
|
} else {
|
|
((CardLinearLayout) holder.itemView).setBottom(false);
|
|
}
|
|
|
|
if (order) {
|
|
holder.home2_game_order.setVisibility(View.VISIBLE);
|
|
holder.home2_game_order.setText(String.valueOf(position + 1));
|
|
} else {
|
|
holder.home2_game_order.setVisibility(View.GONE);
|
|
}
|
|
|
|
final GameEntity gameEntity = subjectList.get(position);
|
|
|
|
// ImageUtils.getInstance(context).display(gameEntity.getIcon(), holder.gameThumb);
|
|
holder.gameThumb.setImageURI(gameEntity.getIcon());
|
|
holder.gameNameAndSize.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);
|
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
map.put("location", "列表");
|
|
map.put("page", name);
|
|
map.put("game", gameEntity.getName());
|
|
map.put("game_id", gameEntity.getId());
|
|
DataCollectionManager.onEvent(context, "click-item", map);
|
|
|
|
GameUtils.startGameDetailActivity(context, gameEntity, entrance + "(" + name + ")");
|
|
}
|
|
});
|
|
|
|
if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()) {
|
|
holder.downloadBtn.setVisibility(View.GONE);
|
|
} else {
|
|
if (gameEntity.getTest().getEnd() == 0) {
|
|
holder.downloadBtn.setVisibility(View.VISIBLE);
|
|
DownloadItemUtils.setOnClickListener(context,
|
|
holder.downloadBtn, gameEntity, position,
|
|
SubjectAdapter.this, entrance + "(" + name + ")", name + ":" + gameEntity.getName());
|
|
} else {
|
|
long endTime = Long.valueOf(gameEntity.getTest().getEnd()
|
|
+ "000");
|
|
long todayTime = new Date().getTime();
|
|
if (todayTime > endTime) {
|
|
// 测试时间已过
|
|
holder.downloadBtn.setVisibility(View.GONE);
|
|
} else {
|
|
// 测试时间未过
|
|
holder.downloadBtn.setVisibility(View.VISIBLE);
|
|
DownloadItemUtils.setOnClickListener(context,
|
|
holder.downloadBtn, gameEntity, position,
|
|
SubjectAdapter.this, entrance + "(" + name + ")", name + ":" + gameEntity.getName());
|
|
}
|
|
}
|
|
}
|
|
|
|
DownloadItemUtils.updateItem(context, holder.gameDes,
|
|
holder.game_progressbar, holder.game_ll_info, holder.download_speed,
|
|
holder.download_percentage, holder.downloadBtn, gameEntity);
|
|
}
|
|
|
|
private void initGameNormalViewHolder(final GameNormalViewHolder holder, int position) {
|
|
|
|
// 第一个
|
|
if (position == 0) {
|
|
((CardLinearLayout) holder.itemView).setmTop(DisplayUtils.dip2px(context, 8));
|
|
} else {
|
|
((CardLinearLayout) holder.itemView).setmTop(0);
|
|
}
|
|
|
|
// 最后一个
|
|
if (position == subjectList.size() - 1) {
|
|
((CardLinearLayout) holder.itemView).setBottom(true);
|
|
} else {
|
|
((CardLinearLayout) holder.itemView).setBottom(false);
|
|
}
|
|
|
|
if (order) {
|
|
holder.home1_game_order.setVisibility(View.VISIBLE);
|
|
holder.home1_game_order.setText(String.valueOf(position + 1));
|
|
} else {
|
|
holder.home1_game_order.setVisibility(View.GONE);
|
|
}
|
|
|
|
final GameEntity gameEntity = subjectList.get(position);
|
|
|
|
// ImageUtils.getInstance(context).display(gameEntity.getIcon(), holder.gameThumb);
|
|
holder.gameThumb.setImageURI(gameEntity.getIcon());
|
|
holder.gameNameAndSize.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.labelList, 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);
|
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
map.put("location", "列表");
|
|
map.put("page", name);
|
|
map.put("game", gameEntity.getName());
|
|
map.put("game_id", gameEntity.getId());
|
|
DataCollectionManager.onEvent(context, "click-item", map);
|
|
|
|
GameUtils.startGameDetailActivity(context, gameEntity, entrance + "(" + name + ")");
|
|
}
|
|
});
|
|
|
|
DownloadItemUtils.setOnClickListener(context, holder.downloadBtn,
|
|
gameEntity, position, this, entrance + "(" + name + ")", name + ":" + gameEntity.getName());
|
|
|
|
DownloadItemUtils.updateItem(context, holder.gameDes,
|
|
holder.game_progressbar, holder.game_ll_info,
|
|
holder.download_speed, holder.download_percentage,
|
|
holder.downloadBtn, gameEntity);
|
|
}
|
|
|
|
public List<GameEntity> getSubjectList() {
|
|
return subjectList;
|
|
}
|
|
|
|
public ArrayMap<String, ArrayList<Integer>> getLocationMap() {
|
|
return locationMap;
|
|
}
|
|
|
|
public boolean isLoaded(){
|
|
return isLoaded;
|
|
}
|
|
|
|
}
|