Files
assistant-android/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java

417 lines
13 KiB
Java

package com.gh.gamecenter.adapter;
import android.content.Context;
import android.content.Intent;
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.LinearLayout;
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.gc.materialdesign.views.ProgressBarCircularIndeterminate;
import com.gh.base.AppController;
import com.gh.common.constant.Config;
import com.gh.common.constant.Constants;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DownloadItemUtils;
import com.gh.common.util.GameViewUtils;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.TimestampUtils;
import com.gh.download.DownloadEntry;
import com.gh.gamecenter.GameDetailsActivity;
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.db.info.GameInfo;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.DismissEntity;
import com.gh.gamecenter.entity.GameEntity;
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;
import java.util.concurrent.LinkedBlockingQueue;
/**
*
* @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 RecyclerView subject_list;
private ProgressBarCircularIndeterminate subject_pb_loading;
private LinearLayout reuse_no_connection;
private List<GameEntity> list;
private boolean order;
private static final int FOOTER_ITEM = 101;
private boolean isLoaded;
// 黄壮华 获取引用 修改2015/8/15
private ArrayMap<String, Integer> locationMap;
private ArrayMap<String, LinkedBlockingQueue<String>> platformMap;
private ArrayMap<String, ArrayMap<String, DownloadEntry>> gameMap;
private ArrayMap<String, String> nameMap;
private ArrayMap<String, String> statusMap;
private DismissEntity dismissEntity;
private int page = 1;
private boolean isRemove;
private boolean isNetworkError;
private int per_page = 20;
private String id;
public SubjectAdapter(Context context,
RecyclerView recyclerView,
ProgressBarCircularIndeterminate pbLoading,
LinearLayout linearLayout,
String id,boolean order) {
this.order = order;
this.context = context;
subject_list = recyclerView;
subject_pb_loading = pbLoading;
reuse_no_connection = linearLayout;
locationMap = new ArrayMap<String, Integer>();
platformMap = new ArrayMap<String, LinkedBlockingQueue<String>>();
gameMap = new ArrayMap<String, ArrayMap<String, DownloadEntry>>();
nameMap = new ArrayMap<String, String>();
statusMap = new ArrayMap<String, String>();
dismissEntity = new DismissEntity(false);
// 黄壮华 添加 初始化游戏状态 修改2015/8/21
DownloadItemUtils.initializeGameMap(context, gameMap);
list = new ArrayList<GameEntity>();
isLoaded = false;
isNetworkError = false;
this.id = id;
initList(page);
}
public void initList(final int page) {
isLoaded =false;
JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(
TimestampUtils.addTimestamp(Config.HOST
+ "v1d50/game/column/" + id +"?page="+ page, Constants.GAME_CD),
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
processingData(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// 无网络连接
if (error.getClass().equals(NoConnectionError.class)
|| error.getClass().equals(TimeoutError.class)) {
if (page == 1){
if (subject_pb_loading != null && subject_pb_loading.getVisibility() == View.VISIBLE) {
subject_pb_loading.setVisibility(View.GONE);
}
Toast.makeText(context, "网络错误", Toast.LENGTH_SHORT).show();
subject_list.setVisibility(View.GONE);
reuse_no_connection.setVisibility(View.VISIBLE);
}else {
Toast.makeText(context, "网络错误", Toast.LENGTH_SHORT).show();
isNetworkError = true;
notifyDataSetChanged();
}
}
}
});
AppController.addToRequestQueue(request, SubjectActivity.class);
}
private void processingData(JSONArray response) {
Type listType = new TypeToken<ArrayList<GameEntity>>() {}.getType();
Gson gson = new Gson();
GameManager manager = new GameManager(context);
List<GameEntity> gameList = gson.fromJson(response.toString(), listType);
if (gameList != null && !gameList.isEmpty()) {
for (GameEntity entity : gameList) {
// 黄壮华 初始化游戏状态 修改2015/8/15
entity.setEntryMap(gameMap.get(entity.getName()));
for (ApkEntity apkEntity : entity.getApk()) {
manager.addOrUpdate(new GameInfo(apkEntity.getPackageName(),
entity.getId(), entity.getName()));
}
}
list.addAll(gameList);
notifyItemRangeInserted(list.size() - gameList.size(), gameList.size());
}
// 黄壮华 获取游戏位置信息 修改2015/8/15
for (int i = 0, size = list.size(); i < size; i++) {
GameEntity entity = list.get(i);
locationMap.put(entity.getName(), i);
for (ApkEntity apkEntity : entity.getApk()) {
nameMap.put(apkEntity.getPackageName(), entity.getName());
}
}
if (subject_pb_loading != null && subject_pb_loading.getVisibility() == View.VISIBLE) {
subject_pb_loading.setVisibility(View.GONE);
}
if (list.isEmpty() || gameList.size() < 20) {
isRemove = true;
notifyDataSetChanged();
}
isLoaded = true;
}
@Override
public int getItemCount() {
if (list.size()<1){
return 0;
}
return list.size()+1;
}
@Override
public int getItemViewType(int position) {
if (list.size() == position) {
return FOOTER_ITEM;
}
return position;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
if (i == FOOTER_ITEM){
View view = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.refresh_footerview, viewGroup, false);
return new FooterViewHolder(view);
}
if (list.get(i).getTest() != null) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.home_game_test_item, viewGroup, false);
return new GameTestViewHolder(view);
} else {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.home_game_normal_item, viewGroup, false);
return new GameNormalViewHolder(view);
}
}
@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(list.size()/per_page+1);
}
});
} 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(GameTestViewHolder holder, int position) {
if (order) {
holder.home2_game_order.setVisibility(View.VISIBLE);
holder.home2_game_order.setText((position + 1) + "");
} else {
holder.home2_game_order.setVisibility(View.GONE);
}
final GameEntity entity = list.get(position);
ImageUtils.getInstance(context).display(entity.getIcon(), holder.gameThumb);
holder.gameNameAndSize.setText(entity.getName());
if (entity.getApk() == null || entity.getApk().isEmpty()) {
holder.gameDes.setText(entity.getBrief());
} else {
holder.gameDes.setText(entity.getApk().get(0).getSize() + " | " + entity.getBrief());
}
holder.gameTestType.setText(entity.getTest().getType());
if (entity.getTest().getStart() == 0) {
holder.gameTestTime.setVisibility(View.GONE);
} else {
holder.gameTestTime.setText(GameViewUtils.getGameTestDate(entity.getTest().getStart()));
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppController.put("GameEntity", entity);
Intent intent = new Intent(context,
GameDetailsActivity.class);
intent.putExtra("entrance", "主页-新测卡牌");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
if (entity.getApk() == null || entity.getApk().isEmpty()) {
holder.downloadBtn.setVisibility(View.GONE);
} else {
if (entity.getTest().getEnd() == 0) {
holder.downloadBtn.setVisibility(View.VISIBLE);
DownloadItemUtils.setOnClickListener(context,
holder.downloadBtn, holder.download_speed,
holder.download_percentage, entity, position,
SubjectAdapter.this,
statusMap, platformMap, "主页-新测卡牌",
dismissEntity, "主页:" + entity.getName());
} else {
long endTime = Long.valueOf(entity.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, holder.download_speed,
holder.download_percentage, entity, position,
SubjectAdapter.this, statusMap, platformMap,
"主页-新测卡牌", dismissEntity,
"主页:" + entity.getName());
}
}
}
DownloadItemUtils.updateItem(context, holder.labelList,
holder.game_progressbar, holder.game_ll_info, holder.download_speed,
holder.download_percentage, holder.downloadBtn, entity, platformMap,
statusMap);
}
private void initGameNormalViewHolder(GameNormalViewHolder holder, int position) {
if (order) {
holder.home1_game_order.setVisibility(View.VISIBLE);
holder.home1_game_order.setText((position + 1) + "");
} else {
holder.home1_game_order.setVisibility(View.GONE);
}
final GameEntity entity = list.get(position);
ImageUtils.getInstance(context).display(entity.getIcon(), holder.gameThumb);
holder.gameNameAndSize.setText(entity.getName());
if (entity.getApk() == null || entity.getApk().isEmpty()) {
holder.gameDes.setText(entity.getBrief());
} else {
holder.gameDes.setText(entity.getApk().get(0).getSize() + " | " + entity.getBrief());
}
GameViewUtils.setLabelList(context, holder.labelList, entity.getTag());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Map<String, Object> kv = new HashMap<String, Object>();
kv.put("入口", "热门卡牌");
DataUtils.onEvent(context, "游戏详情", entity.getName(), kv);
AppController.put("GameEntity", entity);
Intent intent = new Intent(context, GameDetailsActivity.class);
intent.putExtra("entrance", "热门卡牌");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
DownloadItemUtils.setOnClickListener(context, holder.downloadBtn,
holder.download_speed, holder.download_percentage,
entity, position, this,
statusMap, platformMap, "热门卡牌", dismissEntity, "hotcard:" + entity.getName());
DownloadItemUtils.updateItem(context, holder.labelList,
holder.game_progressbar, holder.game_ll_info,
holder.download_speed, holder.download_percentage,
holder.downloadBtn, entity, platformMap, statusMap);
}
public List<GameEntity> getList() {
return list;
}
public ArrayMap<String, Integer> getLocationMap() {
return locationMap;
}
public ArrayMap<String, LinkedBlockingQueue<String>> getPlatformMap() {
return platformMap;
}
public ArrayMap<String, ArrayMap<String, DownloadEntry>> getGameMap() {
return gameMap;
}
public ArrayMap<String, String> getNameMap() {
return nameMap;
}
public ArrayMap<String, String> getStatusMap() {
return statusMap;
}
public DismissEntity getDismissEntity() {
return dismissEntity;
}
public boolean isLoaded(){
return isLoaded;
}
}