Files
assistant-android/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.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;
}
}