Files
assistant-android/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java

373 lines
11 KiB
Java

package com.gh.gamecenter.game;
import android.content.Context;
import android.content.Intent;
import android.support.v4.util.ArrayMap;
import android.support.v4.widget.SwipeRefreshLayout;
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.adapter.viewholder.FooterViewHolder;
import com.gh.gamecenter.adapter.viewholder.GameNormalViewHolder;
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.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.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 Game3FragmentAdapter extends
RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Game3Fragment fragment;
private Context context;
private RecyclerView recyclerView;
private SwipeRefreshLayout game_swipe_refresh;
private LinearLayout reuse_no_connection;
private ProgressBarCircularIndeterminate game_pb_loading;
private boolean isRemove;
private boolean isLoading;
private boolean isNetworkError;
private List<GameEntity> list;
// 黄壮华 获取引用 修改2015/8/15
private ArrayMap<String, Integer> locationMap;
private ArrayMap<String, ArrayMap<String, DownloadEntry>> gameMap;
private ArrayMap<String, LinkedBlockingQueue<String>> platformMap;
private ArrayMap<String, String> nameMap;
private ArrayMap<String, String> statusMap;
private DismissEntity dismissEntity;
// 黄壮华 获取引用 修改2015/8/15
public Game3FragmentAdapter(Game3Fragment fment,
ArrayMap<String, Integer> lMap,
ArrayMap<String, ArrayMap<String, DownloadEntry>> gMap,
ArrayMap<String, LinkedBlockingQueue<String>> pMap,
ArrayMap<String, String> nMap, RecyclerView rView,
SwipeRefreshLayout swipeRefreshLayout,
LinearLayout linearLayout,
ArrayMap<String, String> sMap,
DismissEntity dEntity,
ProgressBarCircularIndeterminate pbLoading,
boolean isLoad) {
this.fragment = fment;
this.context = fment.getActivity();
locationMap = lMap;
gameMap = gMap;
platformMap = pMap;
nameMap = nMap;
statusMap = sMap;
recyclerView = rView;
game_swipe_refresh = swipeRefreshLayout;
reuse_no_connection = linearLayout;
game_pb_loading = pbLoading;
dismissEntity = dEntity;
isRemove = false;
isLoading = false;
isNetworkError = false;
list = new ArrayList<GameEntity>();
if (isLoad) {
load();
}
}
public void load() {
new Thread(new Runnable() {
@Override
public void run() {
addList(0);
}
}){}.start();
}
public void addList(final int offset) {
if (isLoading) {
return;
}
isLoading = true;
JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(
TimestampUtils.addTimestamp(
Config.HOST + "v1d50/game/danjiyouxi?limit=20&offset=" + offset,
Constants.GAME_CD),
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
processingData(response, offset);
isLoading = false;
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
isLoading = false;
// 无网络连接
if (error.getClass().equals(NoConnectionError.class)
|| error.getClass().equals(TimeoutError.class)) {
if (offset == 0) {
if (game_swipe_refresh != null && game_swipe_refresh.isRefreshing()) {
game_swipe_refresh.setRefreshing(false);
}
if (game_pb_loading != null && game_pb_loading.getVisibility() == View.VISIBLE) {
game_pb_loading.setVisibility(View.GONE);
}
recyclerView.setVisibility(View.GONE);
reuse_no_connection.setVisibility(View.VISIBLE);
} else {
Toast.makeText(context, "网络错误", Toast.LENGTH_SHORT).show();
isNetworkError = true;
notifyItemChanged(getItemCount() - 1);
}
}
}
});
AppController.addToRequestQueue(request, Game3Fragment.class);
}
private void processingData(JSONArray response, int offset) {
Type listType = new TypeToken<ArrayList<GameEntity>>() {}.getType();
Gson gson = new Gson();
List<GameEntity> gameList = gson.fromJson(response.toString(), listType);
if (gameList != null && !gameList.isEmpty()) {
if (!list.isEmpty()) {
for (int i = 0; i < gameList.size(); i++) {
GameEntity entity = gameList.get(i);
// 去重
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getId().equals(entity.getId())) {
gameList.remove(i);
i--;
break;
}
}
}
}
GameManager manager = new GameManager(context);
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);
if (!fragment.isHidden() && !fragment.isEverpause()) {
notifyItemRangeInserted(list.size() - gameList.size(), gameList.size());
}
}
if (fragment.isHidden() || fragment.isEverpause()) {
notifyDataSetChanged();
}
if (game_swipe_refresh != null && game_swipe_refresh.isRefreshing()) {
game_swipe_refresh.setRefreshing(false);
}
if (game_pb_loading != null && game_pb_loading.getVisibility() == View.VISIBLE) {
game_pb_loading.setVisibility(View.GONE);
}
if (gameList == null || gameList.isEmpty() || (offset == 0 && gameList.size() < 20)) {
isRemove = true;
notifyItemRemoved(getItemCount());
}
// 黄壮华 获取游戏位置信息 修改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());
}
}
}
@Override
public int getItemCount() {
if (list.size() == 0) {
return 0;
}
if (isRemove) {
return list.size();
} else {
return list.size() + 1;
}
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
if (i == list.size()) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.refresh_footerview, viewGroup, false);
return new FooterViewHolder(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, list.get(position), position);
} else if (viewHolder instanceof FooterViewHolder) {
initFooterViewHolder((FooterViewHolder) viewHolder);
}
}
private void initGameNormalViewHolder(GameNormalViewHolder holder, final GameEntity entity, int 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 {
entity.getApk().get(0).setPlatform("local_plugin");
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);
Map<String, Object> map = new HashMap<String, Object>();
map.put("location", "单机");
map.put("createOn", System.currentTimeMillis() / 1000);
map.put("game", entity.getName());
map.put("page", "游戏");
DataCollectionManager.onEvent(context, "click-item", map);
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, "游戏-单机", false, 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,
false);
}
private void initFooterViewHolder(FooterViewHolder holder) {
if (isNetworkError) {
holder.footerview_progressbar.setVisibility(View.GONE);
holder.footerview_tv_loading.setText("加载失败,点击重试");
holder.itemView.setClickable(true);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isNetworkError = false;
notifyItemChanged(getItemCount() - 1);
addList(list.size());
}
});
} else {
holder.footerview_progressbar.setVisibility(View.VISIBLE);
holder.footerview_tv_loading.setText("加载中...");
holder.itemView.setClickable(false);
}
}
public List<GameEntity> getList() {
return list;
}
public boolean isRemove() {
return isRemove;
}
public void setRemove(boolean isRemove) {
this.isRemove = isRemove;
}
public boolean isLoading() {
return isLoading;
}
public boolean isNetworkError() {
return isNetworkError;
}
public void setNetworkError(boolean isNetworkError) {
this.isNetworkError = isNetworkError;
}
}