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 { private Context context; private RecyclerView subject_list; private ProgressBarCircularIndeterminate subject_pb_loading; private LinearLayout reuse_no_connection; private List list; private boolean order; private static final int FOOTER_ITEM = 101; private boolean isLoaded; // 黄壮华 获取引用 修改2015/8/15 private ArrayMap locationMap; private ArrayMap> platformMap; private ArrayMap> gameMap; private ArrayMap nameMap; private ArrayMap 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(); platformMap = new ArrayMap>(); gameMap = new ArrayMap>(); nameMap = new ArrayMap(); statusMap = new ArrayMap(); dismissEntity = new DismissEntity(false); // 黄壮华 添加 初始化游戏状态 修改2015/8/21 DownloadItemUtils.initializeGameMap(context, gameMap); list = new ArrayList(); 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() { @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>() {}.getType(); Gson gson = new Gson(); GameManager manager = new GameManager(context); List 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 kv = new HashMap(); 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 getList() { return list; } public ArrayMap getLocationMap() { return locationMap; } public ArrayMap> getPlatformMap() { return platformMap; } public ArrayMap> getGameMap() { return gameMap; } public ArrayMap getNameMap() { return nameMap; } public ArrayMap getStatusMap() { return statusMap; } public DismissEntity getDismissEntity() { return dismissEntity; } public boolean isLoaded(){ return isLoaded; } }